病例陈述中的类

问题描述:

我无法确定为什么这两个函数的行为不同。我可以只使用符号或我自己的常量,但我很想知道这里发生了什么(如果我做的不好)。病例陈述中的类

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 

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子句,则每次都会执行该子句。

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

convert方法不匹配任何东西,默认为else这就是为什么你会得到4.4。

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