3

仅供参考,使用 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。

4

2 回答 2

8

Ruby 的case语句比大多数其他switch语句灵活得多。它使用===运算符,而不是==运算符。类===按照以下方式定义运算符

def ===(other) other.is_a? self #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
于 2013-01-22T05:55:33.867 回答
3

Rubycase使用===大小写相等运算符)来检查相等性。

虽然0.class == Fixnum结果为真,但0.class === Fixnum结果为假。

于 2013-01-22T05:53:49.797 回答