2012-03-05 67 views
0

我無法確定爲什麼這兩個函數的行爲不同。我可以只使用符號或我自己的常量,但我很想知道這裏發生了什麼(如果我做的不好)。病例陳述中的類

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 

回答

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

在你轉換功能你所得到的類型Integer這是Class。這就是爲什麼它與你所期望的不同。

0

convert方法不匹配任何東西,默認爲else這就是爲什麼你會得到4.4。

此外,如果您希望方法輸出4.4那麼您需要使用十進制而不是整數。