我无法确定为什么这两个函数的行为不同。我可以使用符号或我自己的常量,但我非常希望知道这里发生了什么(如果我做的不好)。
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
答案 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 Class
或when Module
子句,则每次都会执行它。
答案 1 :(得分:1)
在您的转换功能中,您获得Integer
类型Class
。这就是为什么它与你的期望不同。
答案 2 :(得分:0)
convert
方法不匹配任何内容并默认为else
,这就是为什么你得到4.4。
此外,如果您希望方法输出4.4
,那么您需要使用小数而不是整数。