Ruby case语句未按预期执行

时间:2013-01-22 05:42:31

标签: ruby-on-rails ruby

Fyi,使用Rails。

给定user = User.find(1)

此case语句在返回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 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

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