2013-01-22 25 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會導致錯誤。