違いは何ですか
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
そして
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
何らかの理由で、これらの最初のものは時々機能し、2番目は機能しません。また、2番目のものは機能し、最初のものは機能しません。どうして?それを行うための「適切な」方法はどれですか?
以下を使用する必要があります。
case item
when MyClass
...
私は同じ問題を抱えていました: 「case when」でErrno :: ECONNRESETクラスをキャッチする方法?
ええ、Nakilonは正しいです。threequal===演算子がwhen
句で指定されたオブジェクトに対してどのように機能するかを知っておく必要があります。 Rubyで
_case item
when MyClass
...
when Array
...
when String
...
_
本当に
_if MyClass === item
...
elsif Array === item
...
elsif String === item
...
_
Caseがthreequalメソッド(MyClass.===(item)
など)を呼び出していること、そしてそのメソッドを任意に実行するように定義できること、そしてcaseステートメントをprecisionwで使用できることを理解する
次を使用できます。
case item.class.to_s
when 'MyClass'
...次のねじれが不可能な場合:
case item
when MyClass
これは、case
が===
を使用し、 ===
演算子が記述する関係がnot commutative 。たとえば、5
はInteger
ですが、Integer
は5
?です。これは、case
/when
の考え方です。
Rubyでは、クラス名は特定のクラスを記述するClass
型のオブジェクトを参照する定数です。つまり、RubyでMyClass
と言うことは、JavaでMyClass.class
と言うことと同等です。
obj.class
は、Class
のクラスを記述するobj
型のオブジェクトです。 obj.class
がMyClass
の場合、MyClass.new
を使用してobj
が作成されます(大まかに言えば)。 MyClass
は、MyClass.new
を使用して作成されたオブジェクトを記述するClass
型のオブジェクトです。
MyClass.class
はMyClass
オブジェクトのクラスです(説明するタイプClass
のオブジェクトのclassMyClass.new
)を使用して作成されたオブジェクト。つまり、MyClass.class == Class
。
item
変数の性質に依存します。オブジェクトのインスタンスの場合、たとえば.
t = 5
それから
t.class == Fixnum
ただし、それ自体がクラスの場合
t = Array
それはClass
オブジェクトになるので、
t.class == Class
[〜#〜] edit [〜#〜]: 「case when」でErrno :: ECONNRESETクラスをキャッチする方法を参照してください。 ? 私の答えが間違っている可能性があるため、ナキロンが述べたように。