ruby基础知识点

第一次接触ruby还是16年7月,当时使用ruby写自动化测试脚本用了两三个月,之后就丢一边了。最近因为项目需要使用ruby,复习其语法特性(和python3.6对比学习),记录一些知识点。
参考资料《Ruby基础教程》

  1. ruby是完全面向对象的高级的解释型语言。(和python一样)
    常用的对象有:
  • 数值对象
  • 字符串对象
  • 数组
  • hash
  • 正则表达式对象(python里面是一个单独的re模块)
  • 时间对象
  • 文件对象
  • 符号对象
  1. 变量(各种变量由其命名区分,python不一样)
  • 局部变量
  • 实例对象(@开头)
  • 类对象(@@开头)
  • 全局变量($开头)
  1. ruby支持多重赋值
    a, b, c = 1, 2, 3
    a, b, c, d = 1, 2 #=> [1, 2, nil] 多了不管少了补nil
  2. 置换变量的值
    a, b = b, a # 置换变量a、 b 的值
  3. 获取数组元素
    用数组赋值, 左边有多个变量时, Ruby 会自动获取数组的元素进行多重赋值。
ary = [1, 2]
a, b = ary
p a #=> 1
p b #=> 2
  1. nil:ruby的null
  2. 条件语句
  • 语句的格式

有end这个结束符,缩进无所谓

if exp then  # then可以省略
处理 1
elsif 条件 2 then
处理 2
elsif 条件 3 then
处理 3
else
处理 4
end
  • unless
    和if的相反
  1. 逻辑运算符(和Java一致)
    与 && (python 是and)
    或 || (python是or)

  2. case语句(这个py没有,类似Java的switch)

when 值 1 then
处理 1
when 值 2 then
处理 2
when 值 3 then
处理 3
else
处理 4
end

※ 可以省略 then

  1. if 修饰符与 unless 修饰符
    if 与 unless 可以写在希望执行的代码的后面
puts "a 比b 大" if a > b

python也有类似语法,不过必须要有else:

print('yes') if a>b else print('no')

11.获取对象id

python使用内置方法id(obj)

使用内置属性 object_id(或者 id

  1. 相等判断
    使用对象方法equal?():
    p str1.equal?(str2)
    python直接用"=="

  2. 循环
    Ruby 中有两种实现循环的方法。

  • 循环语句
    自带的循环语句
  • 方法实现循环
    相当于自定义循环方法,但是是基于循环语句和yield

将块传给方法, 然后在块里面写上需要循环的处理。 一般我们在为了某种特定目的而需要定制循环结构时, 才使用方法来实现循环 .

六种循环语句或方法:

  • times 方法
  • while 语句
  • each 方法
  • for 语句
  • until 语句
  • loop 方法
    代码示例:
# times使用
# 执行七遍
7.times do
puts "aa"
end

循环次数 .times do
希望循环的处理
end
块的 do ~ end 部分可以用{~} 代替, 像下面这样:
循环次数 .times {
希望循环的处理
}
在
times 方法的块里, 也是可以获知当前的循环次数的。
10.times do |i|
  puts i
end

# for语句
sum=0
for i in 1..5
sum = sum + i
end
puts sum

# 1..5 是range对象 [1,5]这个区间,1...5则是[1,5)这个区间

for 变量 in 开始时的数值 ..结束时的数值 do
   处理
end
# 可以省略 do

普通的 for 语句如下所示:
for 变量 in 对象 do # 对象得是可迭代对象
  处理
end
# 可以省略 do

# while语句
while 条件 do  # 都可以省略
  处理
end
# util语句
和while反过来
until 条件 do
   处理
end


# each 方法
迭代可迭代对象的方法
对象 .each do | 变量 |
   处理
end
do ~end 可以改成{}结构

# loop语句
写死循环的语句
loop do
print "loop"
end

  1. 循环控制语句
  • break
  • next 类比continue
  • redo 把循环体的处理再来一次
  1. 方法
  • 方法的分类:
    • 实例方法 (对象.方法名)
    • 类方法 (类名 . 方法名,类名 :: 方法名 )
    • 函数式方法 (没有接受者的方法,如print)
  • 方法定义
def 方法名( 参数 1, 参数 2, …)
希望执行的处理
end

可以指定默认值给参数,只省略左边的参数或者中间的某个参数是不行的.这一点和python相同,python的关键字参数(也就是指定了默认值的参数)必须在后面.

  • 返回值
    如果没有写return语句,最后一个表达式的结果会被返回.又和python一样.

  • 定义带块的方法
    这是高级内容? yield的使用.

def myloop
    while true
        yield # 执行块
    end
end
# 使用:
# 块里面的语句会传给yield来执行
num = 1 # 初始化num
myloop do
    puts "num is #{num}" # 输出num
    break if num > 100 # num 超过 100 时跳出循环
    num *= 2 # num 乘2
end

  • 不定参方法

python是使用args来接收多个普通参数,*agrs来接收多个关键字参数.

ruby是:

# 哇哦 和python差不多啊
def foo(*args)
  args
end
p foo(1, 2, 3) #=> [1, 2, 3]   也是封装成list对象.

  • ruby的关键字参数
    python的字典{'a':1,'b':'222'}
    ruby的字典(hash):{'a'=>1},符号字典{a:1}
    python的关键字参数 def func(a=100)
    ruby的关键字参数def func(a:100)
    ruby也支持**agrs接收不定参的关键字参数,但是传入的时候是符号hash:
# ruby
def f1(a:100,**args)
    puts a
    puts args
end
f1(a:10,b:200)
相当于:
arg = {a:10,b:20} # 这是字面量,不是hash(字典对象),ruby的字典是{k=>V}这个形式的
f1(arg)
#结果
10
{:b=>200}

注意传入的参数形式,和python是不一样的,python的关键字参数,传入的是字典对象拆包:

# Python
def f1(a=1,**args):
    print(a)
    print(args)
args= {'a':10,'b':1}

f1(**args)
相当于f1(a=10,b=1)
# 结果:
10
{'b': 1}

你可能感兴趣的:(ruby基础知识点)