2013-01-22 26 views
3

Fyi,使用Rails。Ruby case语句没有按预期执行

鉴于user = User.find(1)

这种情况语句返回nil时,它应该返回的self.do_something_with_user结果。

def case_method 
    case self.class 
     when User 
     self.do_something_with_user # assume does not return nil 
     when SomeOtherClass 
     self.do_something_else 
     else 
     nil 
    end 
end 

user.case_method # => nil 

我在想什么?使用pry,self.class == User返回true。

+2

是什么'do_something_with_user'返回?它有可能返回'nil'吗?尝试调试打印以确定哪个分支得到执行。 –

回答

7

Ruby的case声明比其他大多数switch声明灵活得多。它使用===运算符,而不是==运算符。类定义了===运营商沿线

def ===(其他) other.is_a?自#self是类 结束

所以,你居然想在这里是什么:

def case_method 
    case self 
    when User 
    do_something_with_user 
    when SomeOtherClass 
    do_something_else 
    end # else is un-needed as it will return nil by default 
end 
3

Ruby的case使用===case equality operator)来检查相等性。

虽然0.class == Fixnum结果为true,但0.class === Fixnum会导致错误。