use*_*882 6 ruby class constants switch-statement
我使用的是Ruby 1.9.2和Ruby on Rails 3.2.2.我有以下方法:
# Note: The 'class_name' parameter is a constant; that is, it is a model class name.
def my_method(class_name)
case class_name
when Article then make_a_thing
when Comment then make_another_thing
when ... then ...
else raise("Wrong #{class_name}!")
end
end
Run Code Online (Sandbox Code Playgroud)
我想理解为什么在case上面的语句中,else当我执行类似的方法调用时,它始终运行"部分" my_method(Article),my_method(Comment)依此类推.
我该如何解决这个问题?有人有建议如何处理这个?
这是因为在 Class(或者具体来说是 Class 的派生模块)上调用, 和 是这样实现的case:======
\n\n\n
mod === obj\xe2\x86\x92true或false大小写相等 \xe2\x80\x94
\ntrue如果obj是 \xe2\x80\x99s 后代的实例mod或其中之一,则返回mod。对于模块的用途有限,但可以在 case 语句中用于按类对对象进行分类。
这意味着对于除Class&之外的任何常量Module(例如Foo),Foo === Foo始终返回false。因此,您总是会在声明else中得到该条件case。
相反,只需case使用对象本身进行调用,而不是使用其类或 useif语句。