看case时,碰见了3等号===操作符,需要确认一下细节了。
equal?
我们经常要比较两个对象,Ruby中提供了多种比较对象的方法。我们可以通过equal?方法比较两个对象是否相同,通过这种方式是比较两个值是否指向同一个对象的引用。比如:
a = "Ruby" # 一个字符串对象。 b = c = "Ruby" # 两个字符串对象指向动一个引用。 a.equal?(b) # false: a和b是不同的对象。 b.equal?(c) # true: b和c指向同一个引用。
这种比较方式实际上是比较两个对象的ID是否相同,显然a是一个对象,而b和c指向另一个对象,他们的对象ID是不同的:
a.object_id == b.object_id # 等同于 a.equal?(b)
b = "Ruby" # 虽然和a的内容相同,但是他们是不同的对象 a.equal?(b) # false: a和b指向不同的对象 a == b # true: 他们的内容是相同的
除了字符串外,数组和字典类也定义了==操作符,如果两个数组或两个字典对象中元素个数相同,且每个元素都相同,那么==返回true.
(1..10) === 5 # true: 5属于range 1..10
/\d+/ === "123" # true: 字符串匹配这个模式 String === "s" # true: "s" 是一个字符串类的实例 :s === "s" # true