本文已参与「新人创作礼」活动,一起开启掘金创作之路。
=== 与case语句
case 语句在判断与when 指定的值是否相等时,实际上是使用 === 运算符来判断的。左边是数值或者字符串时,=== 与 == 的意义是一样的,除此以外,=== 还可以与 =~ 一样来判断正则表达式是否匹配,或者判断右边的对象是否属于左边的类,等等。相比单纯地判断两边的值是否相等,=== 能表达更加广义的“相等”。
对象的同一性
所有的对象都有标识和值。标识 (ID)用来表示对象的同一性。Ruby中所有对象都是唯一的,对象的ID可以通过object_id (或者__id__ )方法获得。
ary1 = []
ary2 = []
p ary1.object_id #=> 67653636
p ary2.object_id #=> 67650432
我们用equal? 方法判断两个对象是否为同一个对象(ID是否相同)。
str1 = "foo"
str2 = str1str3 = "f" + "o" + "o"
p str1.equal?(str2) #=> true
p str1.equal?(str3) #=> false
对象的值就是对象拥有的信息。例如,只要对象的字符串内容相等,Ruby就会认为对象的值相等。Ruby使用 == 来判断对象的值是否相等。
除了 == 以外,Ruby还提供了eql? 方法来判断对象的值是否相等。== 与eql? 都是Object 类定义的方法,大部分情况下它们的执行结果都是一样的。但也有例外,数值类会重定义eql? 方法,因此执行后有不一样的结果。
p 1.0 == 1 #=> true
p 1.0.eql?(1) #=> false
凭直觉来讲,把1.0 与1 判断为相同的值会更加方便。一般情况下进行值的比较时会使用 ==,但是在一些需要进行更严谨的比较的程序中,就需要用到eql? 方法。例如,0 与0.0 作为hash的键时会被判断为不同的键,这是由于hash对象内部的键的比较使用了eql? 方法。
实现循环的方法
times方法
使用times 方法实现循环时,需要用到块do ~end,而do ~end 部分可以用{~}代替。
主要用途:确定了循环次数时使用
for 语句
for 语句同样是用于实现循环的。需要注意的是,与times 方法不同,for 并不是方法,而是Ruby提供的循环控制语句。for语句循环的开始值和结束值可以任意指定。
主要用途:从对象中取出元素时使用(each的语法糖)
while 语句
只要for 语句能实现的循环,就没必要特意将它改写为while 语句。但是在某些情况下,使用while 语句会更便于理解.
主要用途:希望自由指定循环条件时使用
until 语句
与if 语句相对的有unless 语句,同样地,与while 语句相对的有until 语句。until 语句的结构与while 语句完全一样,只是条件判断刚好相反,不满足条件时才执行循环处理。换句话说,while 语句是一直执行循环处理,直到条件不成立为止;until 语句是一直执行循环处理,直到条件成立为止。
主要用途:使用while语句会使得代码更难读懂时使用
each 方法
each 方法将对象集合中的对象逐个取出,这与for 语句循环取出数组元素非常相似。可以很容易的将使用for语句的代码改为使用each方法的代码。在Ruby内部,for 语句是用each 方法来实现的。因此,可以使用each 方法的对象,同样也可以指定为for 语句的循环对象。
主要用途:从对象中取出元素时使用
loop 方法
loop方法是一种没有终止循环的条件,只是不断执行循环处理的方法。为了避免不断循环输出的情况发生,在实际使用loop 方法时,需要用到break控制循环的命令,使程序可以中途跳出循环。
主要用途:不限制循环次数时使用
循环控制
break:终止程序,跳出循环
next:跳到下一次循环
redo:在相同的条件下重复刚才的处理
ruby中的约定俗成
约定俗成的编码规则: 跨行写程序时使用do ~end 程序写在一行时用{ ~}