2012-03-05 4 views
0

これらの2つの関数が異なる動作をする理由を判断できません。私はシンボルや自分の定数を使うことができますが、ここで何が起こっているのかを知りたいと思っています。あなたはClassあるタイプIntegerを取得しているあなたの変換機能でケースステートメントのクラス

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に相当します。 is the String class an Integer?、またはis the String class a String?を尋ねるようなものだ

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

convert 1, String 

はに相当します。両方の質問に対する回答は No, it is a Class.です。コードの点で

IntegerあるいはString自体に何らかの方法で関連していないString.class戻りClass、。 when Classまたはwhen Module句を導入した場合は、毎回実行されます。

1

。それがあなたが期待するものとは異なる理由です。

0

convertメソッドは何も一致していません。デフォルトではelseに設定されています。これが4.4になります。

また、出力するメソッドが4.4の場合は、decimalとnot integerを使用する必要があります。

関連する問題