case语句中的类

时间:2012-03-05 01:35:03

标签: ruby class if-statement switch-statement

我无法确定为什么这两个函数的行为不同。我可以使用符号或我自己的常量,但我非常希望知道这里发生了什么(如果我做的不好)。

def convert(value, type)
    case type
    when Integer
        value.to_i
    when String
        value.to_s
    else
        value
    end
end

def convert_with_if(value, type)
    if (type == Integer)
        value.to_i
    elsif (type == String)
        value.to_s
    else
        value
    end
end

n = 4.4
p convert(n, Integer)  #=> 4.4
p convert_with_if(n, Integer) #=> 4

3 个答案:

答案 0 :(得分:2)

case调用===,大小写相等运算符。 Module#===,并且通过扩展Class#===,实际测试给定参数的类是接收者还是其后代之一。 String === object实际上相当于object.kind_of? String

convert 1, String

相当于:

case String
  when Integer
    1.to_i
  when String
    1.to_s
end

这就像问is the String class an Integer?is the String class a String?一样。这两个问题的答案是No, it is a Class.

就代码而言,String.class会返回Class,这与Integer甚至String本身无关。如果您引入了when Classwhen Module子句,则每次都会执行它。

答案 1 :(得分:1)

在您的转换功能中,您获得Integer类型Class。这就是为什么它与你的期望不同。

答案 2 :(得分:0)

convert方法不匹配任何内容并默认为else,这就是为什么你得到4.4。

此外,如果您希望方法输出4.4,那么您需要使用小数而不是整数。