case..when是否有可能的祖先列表?

时间:2011-10-10 14:53:24

标签: ruby

如果我想根据对象实例的类型使用case..when进行切换,我可以这样做:

case obj
  when Class1
    "whatever"
  when Class2
    "something else"
end

但是,如果我正在比较的值是一个类本身,并且我想根据它所来自的类进行切换,那么case..when是否仍然保持不变?以下不起作用,但做了什么?

class Foo < String; end
class Bar < Array; end

klass = Foo

case klass
  when String
    "klass descends from String"
  when Array
    "klass descends from Array"
end

基本上是<=运算符的作用,但是在case..when的上下文中。

编辑|为了澄清,我想支持在继承链中的任何地方进行匹配,而不仅仅是直接的父对象。

2 个答案:

答案 0 :(得分:1)

这有效:

case
  when klass <= String
    "klass descends from String"
  when klass <= Array
    "klass descends from Array"
end

我不确定它是否比一堆if和elsif更好。

答案 1 :(得分:0)

这适合我,但不是很漂亮:

result = case
  when klass.ancestors.include?(String)
    "klass descends from String"
  when klass.ancestors.include?(Array)
    "klass descends from Array"
end