第一次接触ruby还是16年7月,当时使用ruby写自动化测试脚本用了两三个月,之后就丢一边了。最近因为项目需要使用ruby,复习其语法特性(和python3.6对比学习),记录一些知识点。
参考资料《Ruby基础教程》
- ruby是完全面向对象的高级的解释型语言。(和python一样)
常用的对象有:
- 数值对象
- 字符串对象
- 数组
- hash
- 正则表达式对象(python里面是一个单独的re模块)
- 时间对象
- 文件对象
- 符号对象
- 变量(各种变量由其命名区分,python不一样)
- 局部变量
- 实例对象(@开头)
- 类对象(@@开头)
- 全局变量($开头)
- ruby支持多重赋值
a, b, c = 1, 2, 3
a, b, c, d = 1, 2 #=> [1, 2, nil] 多了不管少了补nil
- 置换变量的值
a, b = b, a # 置换变量a、 b 的值
- 获取数组元素
用数组赋值, 左边有多个变量时, Ruby 会自动获取数组的元素进行多重赋值。
ary = [1, 2]
a, b = ary
p a #=> 1
p b #=> 2
- nil:ruby的null
- 条件语句
- 语句的格式
有end这个结束符,缩进无所谓
if exp then # then可以省略
处理 1
elsif 条件 2 then
处理 2
elsif 条件 3 then
处理 3
else
处理 4
end
- unless
和if的相反
逻辑运算符(和Java一致)
与 && (python 是and)
或 || (python是or)case语句(这个py没有,类似Java的switch)
when 值 1 then
处理 1
when 值 2 then
处理 2
when 值 3 then
处理 3
else
处理 4
end
※ 可以省略 then
- 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)
相等判断
使用对象方法equal?():
p str1.equal?(str2)
python直接用"=="循环
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
- 循环控制语句
- break
- next 类比continue
- redo 把循环体的处理再来一次
- 方法
- 方法的分类:
- 实例方法 (对象.方法名)
- 类方法 (类名 . 方法名,类名 :: 方法名 )
- 函数式方法 (没有接受者的方法,如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}