Ruby学习笔记

1、变量

# -*- coding: UTF-8 -*-

puts "hello world"
name1 = "Joe"
name2 = "Mary"
puts "你好 #{name1},  #{name2} 在哪?"


# 1、定义一个全局变量
$g_v = 10


# 定义一个类,类名必须以大写开头
class Class1
  def test1

    # 格式化,使用#号加变量名的方式
    puts "全局变量的值为#$g_v"
  end
end

class Class2
  def test1
    puts "全局变量的值为#$g_v"
  end
end


# 实例化一个类,用new方法
c1 = Class1.new

c2 = Class2.new

# 实例调用实例方法,用点号
c1.test1

c2.test1




class Class3
  # 这个就是构造方法,和python中的__init__方法是一样的
  def initialize(id,name,add)
    @id = id
    # @符号来定义实例变量
    @name = name
    @add = add
  end

  # ruby定义方法,如果该方法不需要传参,则可以没有这个括号,当然有也没错
  def outputvalue()
    puts "id为#@id"
    # 在字符串中访问实例变量用#@加上变量名
    puts "name为#@name"
    puts "add为#@add"
  end

end

# 初始化一个类的实例,这个类有构造方法,需要参数,这里要传参数去实例化一个类
c3 = Class3.new(1,"c3","sz")

c3.outputvalue





class Class4
  # @@定义了一个类变量,我们这里的用途是统计这个类的实例个数
  @@num = 0
  def initialize(id,name,add)
    @id = id
    @name = name
    @add = add
    @@num += 1
    # 因为类进行实例化必须要执行构造方法,所有我们在构造方法中对类变量进行加1的操作
  end

  def num_of()
    puts "实例的数量为#@@num"
  end
end


c4_1 = Class4.new(1,"c4_1","sz1")
c4_1.num_of
c4_2 = Class4.new(2,"c4_2","sz2")
c4_2.num_of



class Class4
  # 通过大写字母开头定义一个常量
  VAR1 = 20
  VAR2 = 30


  def initialize(id,name,add)
    @id = id
    @name = name
    @add = add
    @@num += 1
    # 因为类进行实例化必须要执行构造方法,所有我们在构造方法中对类变量进行加1的操作
  end

  def num_of()
    puts "实例的数量为#@@num"
  end
end



print <<EOF
AAAA
BBB
CCC
DDD
EOF

 

2、运算符

# 1、赋值运算符

a = 100
b = 200
c = 300

a,b = b,a

d,e,f = 10,20,30

puts a


puts d


# 逻辑运算符
#

test1 = a && d
puts test1



test2 = a || d

puts test2


test3 = !a

puts test3



test4 = 1..10
test5 = 1...10

puts test4
puts test5




res = defined? test
puts res

 

3、条件判断和循环

# if-elsif-else语句
x = 10

# 1、写法1,可以不写then
if x > 1
  puts "大于1"
elsif x < 1
  puts "小于1"
else
  puts "等于1"
end


# 2、写法2,写then
x = 10

if x > 1 then
  puts "大于1"
elsif x < 1 then
  puts "小于1"
else
  puts "等于1"
end




# 3、if修饰符

# code if condition
# if修饰词组表示当 if 右边之条件成立时才执行 if 左边的式子。即如果 conditional 为真,则执行 code。
#
#
$g_v2 = 10

# print "debug\n" if $g_v2
puts "debug\n" if $g_v2

$g_v2 = nil

print "debug\n" if $g_v2



# 4、unless,和if正好相反,如果不满足unless后面的条件,则执行该unless下面的语句

x=1
unless x>2
  puts "x 小于 2"
else
  puts "x 大于 2"
end


# unless修饰符

# code unless conditional   如果 conditional 为假,则执行 code。

$g_v2 = 10

# print "debug\n" if $g_v2
puts "debug1\n" unless $g_v2

$g_v2 = nil

print "debug2\n" unless $g_v2



# 5、case语法,满足第一个条件之后,就不往下继续执行了,就会跳出case语法
$age =  5
case $age
when 0 .. 2
    puts "婴儿"
when 1 .. 6
    puts "小孩"
when 1 .. 12
    puts "child"
when 13 .. 18
    puts "少年"
else
    puts "其他年龄段的"
end




# 6、循环语法
#
# 语法1
$i = 0
$num = 5

while $i < $num
  puts("在循环语句中 i = #$i" )
  $i +=1
end


# 语法2 有个do,这个do可以省略
$i = 0
$num = 5

while $i < $num do
  puts("在循环语句中 i = #$i" )
  $i +=1
end


# 语法3 有个: 这个:和前面必须有空格
$i = 0
$num = 5

while $i < $num ;
  puts("在循环语句中 i = #$i" )
  $i +=1
end



# 语法4 while修饰符
$i = 0
$num = 5
begin
  puts("在循环语句中4 i = #$i" )
  $i +=1
end while $i < $num


# 7、until语法,不满足条件,则执行语句

$i = 0
$num = 5

until $i > $num  do
  puts("在循环语句中 i = #$i" )
  $i +=1;
end


# 8、for语法
for i in 0...5
  puts "局部变量的值为 #{i}"
end


for i in 0..5
  puts "局部变量的值为 #{i}"
end


# 9、break语法
for i in 0..5
  if i > 2 then
    break
  end
  puts "局部变量的值为 #{i}"
end


# 10、next语法,相当于continue

for i in 0..5
  if i < 2 then
    next
  end
  puts "局部变量的值为1 #{i}"
end

# 11、redo语法,从头开始循环,如果满足条件,则从当前循环的条件开始,比如先打印0、1、2,然后i为3满足条件,则打印3,执行redo语句,i还是3,不会从0开始
for i in 0..5
  if i > 2
    puts "局部变量的值为2 #{i}"
    redo
  else
    puts "#{i}"
  end
end

 

4、函数参数

# 方法


# 1、默认参数
# 定义一个方法,该方法有默认参数,所以调用的时候可以传参也可以不不传参
def test(a1="Ruby", a2="Perl")
  puts "编程语言为 #{a1}"
  puts "编程语言为 #{a2}"
end
test "C", "C++"
test


# 2、函数返回值
# 定义一个函数,返回值
def test
  i = 10
  j = 100
  k = 1000
  return i,j,k
end


res = test
puts res


# 3、函数的可变参数 *args

def sample (*args)
  puts "参数个数为 #{args.length}"
  for i in 0...args.length
    puts "参数值为 #{args[i]}"
  end
end
sample "Zara", "6", "F"
sample "Mac", "36", "M", "MCA"

 

5、导入模块

# 从当前目录下导入模块
$LOAD_PATH << '.'

require 'trig'
require 'moral'

# require 导入模块,可以省略rb


# 模块名.方法名---->调用模块的方法
# 模块名;;变量名---->调用模块的变量
#
y = Trig.sin(Trig::PI/4)
puts y

wrongdoing = Moral.sin(Moral::VERY_BAD)
puts wrongdoing

 

6、在类中引入模块

$LOAD_PATH << '.'
require "support"



class Decade
  # 1、定义一个模块,在类中引入这个模块
  include Week
  no_of_yrs=10
  def no_of_months
    # ::使用引入模块中的变量
    puts Week::FIRST_DAY
    number=10*12
    puts number
  end

  def test_module
    # .使用引入的模块中的方法
    Week.weeks_in_year
  end
end
d1=Decade.new
puts Week::FIRST_DAY
Week.weeks_in_month
Week.weeks_in_year
d1.no_of_months

d1.test_module

 

模块的代码

module Week
  FIRST_DAY = "Sunday"
  def Week.weeks_in_month
    puts "You have four weeks in a month"
  end
  def Week.weeks_in_year
    puts "You have 52 weeks in a year"
  end
end

 

7、字符串

# 字符串


# 定义一个字符串
name1 = "Joe"
name2 = "Mary"

# 定义一个字符串,用内建方法
name3 = String.new("hello")

puts name3

# 字符串中引入变量
puts "你好 #{name1},  #{name2} 在哪?"




x, y, z = 12, 36, 72
puts "x 的值为 #{ x }"
puts "x + y 的值为 #{ x + y }"
# 字符串引入表达式
puts "x + y + z 的平均值为 #{ (x + y + z)/3 }"


s = "aAAAA"

s = s.downcase

puts s

 

8、数组

# 数组

# 创建一个没有大小限制的数组
names = Array.new

# 创建一个容量为20的数组
names = Array.new(20)

# 计算数组长度的2个方法
puts names.length
puts names.size


# 为数组中的每个元素赋值
names = Array.new(6,"mac")

puts "#{names}"


# 初始化数组的方式
names = Array.[](1,2,3,4,5,6)

puts "#{names}"

# 初始化数组的方式
names = Array[1,2,3,4,5,6]


# 创建一个数字数组
names = Array(0..9)

puts "#{names}"

# 创建一个数字数组
names = Array(0...9)
puts "#{names}"

 

9、hash

# hash就是一个k-v的集合,和python中的dict一样
#

months = Hash.new

# 创建一个hash
H = Hash["a" => 100, "b" => 200, [1,"jan"] => "January"]

# 获取hash的k对应的v
puts "#{H['a']}"
puts "#{H['b']}"
puts "#{H[ [1,"jan"]]}"

# 获取所有的keys
puts "#{H.keys}"

# 获取所有的values
puts "#{H.values}"

# 打印hash的值
puts "#{H}"

# 为hash添加一个元素
H["c"] = "2b"

puts "#{H.keys}"

# 清空hash
H.clear
puts "#{H}"

 

10、时间模块

# 时间和日期

time = Time.new

# 获取当前的时间
puts "当前时间为:" + time.inspect

# 获取当前时间
puts "当前时间为:" + Time.now.inspect

puts time.year    # => 日期的年份
puts time.month   # => 日期的月份(1 到 12)
puts time.day     # => 一个月中的第几天(1 到 31)
puts time.wday    # => 一周中的星期几(0 是星期日)
puts time.yday    # => 365:一年中的第几天
puts time.hour    # => 23:24 小时制
puts time.min     # => 59
puts time.sec     # => 59
puts time.usec    # => 999999:微秒
puts time.zone    # => "UTC":时区名称

 

11、范围

# 范围 Range
#
#

# 范围(Range)无处不在:a 到 z、 0 到 9、等等。Ruby 支持范围,并允许我们以不同的方式使用范围:
#
# 作为序列的范围
# 作为条件的范围
# 作为间隔的范围

# 这个只能正序排列,倒序不行,倒序是空
range1 = (1..10).to_a

range2 = (1...10).to_a

range3 = ("a".."f").to_a

range4 = ("a"..."f").to_a

range5 = ("bat"..."bay").to_a

# to_a方法,把一个范围转换为列表

puts "#{range1}"
puts "#{range2}"
puts "#{range3}"
puts "#{range4}"
puts "#{range5}"

# 循环
range1.each do |r|
  puts "#{r}"
end

# 过滤出不符合条件的
res = range1.reject{|r| r < 5}

puts "#{res}"


# 作为条件范围
score = 70

result = case score
         when 0..40
           "糟糕的分数"
         when 41..60
           "快要及格"
         when 61..70
           "及格分数"
         when 71..100
           "良好分数"
         else
           "错误的分数"
         end

puts result


# 作为一个间隔的范围
if ((1..10) === 5)
  puts "5 在 (1..10)"
end

if (('a'..'j') === 'c')
  puts "c 在 ('a'..'j')"
end

if (('a'..'j') === 'z')
  puts "z 在 ('a'..'j')"
end

 

12、each

# 迭代器

# each迭代器
ary = [1,2,3,4,5]
ary.each do |i|
  puts i
end

h = Hash("a" => "aa","b" => "bb","c" => "cc")

h.each do |i|
  puts i
end


a = [1,2,3,4,5]
b = Array.new
b = a.collect{ |x|x }
puts b

 

13、文件操作

# 文件的输入和输出

# puts 语句
val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2


# gets 语句,获取用户的输入
#
puts "Enter a value :"
val = gets
puts val


# putc语句,一次输出一个字符
putc val1


# print和puts的方法类似,但是print不会换行,而puts会换行
print "Hello World"
print "Good Morning"


# 打开和关闭文件
#
#
# 读文件
afile = File.open("moral.rb","r")

if afile
  res = afile.sysread(100)
  puts res
else
  puts "error"
end

# 写文件
aFile = File.new("input.txt", "r+")
if aFile
  aFile.syswrite("ABCDEF")
else
  puts "Unable to open file!"
end

 

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...