=== case equality

严格说来, 这个其实跟另外三个不属于一类.

a === b 相当于 “如果我有一个贴了a标签的抽屉, 那么把b放到这个抽屉里是否可行?”

作为case equality operator, 其首要作用自然是在when/case里, 作为判断进入某个分支的依据

1
2
3
4
5
6
7
8
a = 5

case a
when Integer
  "case Integer"
when 5
  "case 5"
end

这段代码其实是会返回"case Integer"的, 因为Integer类重写了===方法

1
2
2.1.1 :043 > Integer === 5
 => true 

相应的, 重写了===的还有Range, Regexp等等

1
2
3
4
5
6
2.1.1 :054 > (1..5) === 5
 => true 
2.1.1 :055 > (1...5) === 5
 => false 
2.1.1 :058 > /(a|e|i|o|u)/ === "hello"
 => true  

对于Object#===, 事实上等价于Object#==.
但是对Object的子类, ===一般会被重写, 使其在条件表达式里有意义.

这里可以拿<=>方法做个类比

比如我们自己定义了个User类, 如果直接就User.all.sort, 是不可以的,
如果想这么用, 你就需要首先在User里面定义一个<=>方法用于比较2个user对象

稍微有点不同的是, 因为===是定义在Object里的
所以即便对自己定义的类里面不重写===方法, 一样可以对其使用case/when
但是这样会调用Object#===, 可能不会得到自定义类需要的结果.

依然用上面的例子来说 如果Integer里面没有重写===方法, 那么得到的返回值就不再是”case Integer”,而是”case 5”了

==

==是最为常用的用于比较两个对象值是否相等的方法

a == b相当于判断”a的值与b的值相同吗”

==方法经常被Object子类重写以满足其自身需求

equal?

equal?方法用来判断2个对象是否是同一个对象

a.equal? b相当于判断”a就是b吗”

1
2
3
4
5
6
2.1.1 :005 > "a" == "a"
 => true 
2.1.1 :006 > "a".equal? "a"
 => false 
2.1.1 :007 > :a.equal? :a
 => true 

==不同, equal?不应该被子类重写

eql?

==类似, 但是可以看做是更严格的==
Object里, ==eql?是同意, 但是很多子类会重写eql?以提供更严格的比较, 比如:

1
2
3
4
5
6
2.1.1 :010 > 1 == 1
 => true 
2.1.1 :011 > 1 == 1.0
 => true 
2.1.1 :012 > 1.eql? 1.0
 => false 

在ActiveAdmin下自定义filter

rails4之后,之前的`model`里加入`search_methods :filter_name`的做法已经失效,需修改为:``` ruby class PromoCode (ids) { with_tags(ids) } def self. …… Continue reading

Mac上搭建Phonegap环境

Published on October 02, 2014

Rails遗留程序里最常犯的错误(译)

Published on July 23, 2014