本帖最后由 taroxd 于 2015-9-26 21:35 编辑
<=>为什么会返回nil?
<=>是在哪定义的?
定义在 Object 里面。若左右两边为同一对象,返回 0,否则返回 nil。
<=>是如何进行比较的?(5和“5”完全是不同类的对象,怎么比?)
5和“5”完全是不同类的对象,没法比。
===该方法通常用在 case 的比较句中。默认情况下,它的运作等同于 Object#==
Range类中===用在 case 句的比较中,若 obj 与 self 之间存在 Object#kind_of? 关系时就为真。
case里有整数和范围的比较,可以正常运行 (整数的类和范围的类没什么所属关系吧,为什么case里可以正常比较?)
Range 类定义了 === 方法,当参数在 Range 区间内的时候返回 true。case 中就是用 === 来判断是否符合条件的。
注意 === 不是用来比较的。这个方法的行为可以自定义:比如判断一个对象是否属于一个类,一个数是否在范围里,正则表达式是否能匹配字符串,甚至直接定义为执行一个 Proc
p 2..6 === 4 这个会报错?
p 2..6 == 4 也同样报错,==定义在顶层Object里,难道不是对一切对象都能用的吗,会有参数错误?
按照优先级,这段代码等价于 p(2..(6 === 4)) 和 p(2..(6 == 4))
请打上括号: p (2..6) === 4
class Game_Actor # 仅为示例,请勿模仿! def <=> other return unless other.respond_to? :name name <=> other.name end end $game_party.actors.sort # 角色都按照名字排序了 case actor_id when Float "ID是小数" when 1, 2 "主角" when 3..8 "酱油" when lambda { |id| id.even? } "ID是偶数" else "" end
class Game_Actor
# 仅为示例,请勿模仿!
def <=> other
return unless other.respond_to? :name
name <=> other.name
end
end
$game_party.actors.sort # 角色都按照名字排序了
case actor_id
when Float
"ID是小数"
when 1, 2
"主角"
when 3..8
"酱油"
when lambda { |id| id.even? }
"ID是偶数"
else
""
end
|