病例陈述中的类
问题描述:
我无法确定为什么这两个函数的行为不同。我可以只使用符号或我自己的常量,但我很想知道这里发生了什么(如果我做的不好)。病例陈述中的类
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 Class
或when Module
子句,则每次都会执行该子句。
答
在你转换功能你所得到的类型Integer
这是Class
。这就是为什么它与你所期望的不同。
答
convert
方法不匹配任何东西,默认为else
这就是为什么你会得到4.4。
此外,如果您希望方法输出4.4
那么您需要使用十进制而不是整数。