155

違いは何ですか

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

なんらかの理由で、これらのうちの最初の 1 つが機能する場合と 2 つ目が機能しない場合と、2 つ目が機能する場合と 1 つ目が機能しない場合があります。なんで?それを行う「適切な」方法はどれですか?

4

5 に答える 5

259

以下を使用する必要があります。

case item
when MyClass
...

私は同じ問題を抱えていました: 「ケースいつ」でErrno::ECONNRESETクラスをキャッチする方法は?

于 2010-10-11T17:11:36.810 に答える
70

ええ、Nakilon は正しいです。threequal === 演算子がwhen句で指定されたオブジェクトに対してどのように機能するかを知っている必要があります。ルビーで

case item
when MyClass
...
when Array
...
when String
...

本当に

if MyClass === item
...
elsif Array === item
...
elsif String === item
...

case が threequal メソッドを呼び出していることを理解してください (MyClass.===(item)たとえば)。そのメソッドは、必要なことを行うように定義できます。その後、case ステートメントを precisionw で使用できます。

于 2010-10-11T17:37:29.767 に答える
20

以下を使用できます。

case item.class.to_s
    when 'MyClass'

...次のひねりが不可能な場合:

case item
    when MyClass

この理由は、 をcase使用して===おり、演算子が記述する関係は可換ではないため===です。たとえば、5はですIntegerInteger5? caseこれが/の考え方ですwhen

于 2015-04-09T23:24:55.873 に答える
5

ClassRuby では、クラス名は、特定のクラスを説明する型のオブジェクトを参照する定数です。つまりMyClass、Ruby で言うことMyClass.classは Java で言うことと同じです。

obj.classClassのクラスを記述するtype のオブジェクトですobjobj.classがの場合MyClass、(大まかに言えば)objを使用して作成されました。を使用して作成された任意のオブジェクトを記述する型のオブジェクトです。MyClass.newMyClassClassMyClass.new

MyClass.classMyClassオブジェクトのクラスです (を使用して作成されたオブジェクトを記述するtype のオブジェクトのクラスです)。つまり、.ClassMyClass.newMyClass.class == Class

于 2010-10-11T17:22:56.363 に答える
1

変数の性質によって異なりitemます。それがオブジェクトのインスタンスである場合、例えば

t = 5

それから

t.class == Fixnum

しかし、それ自体がクラスである場合

t = Array

それはClassオブジェクトになるので、

t.class == Class

編集: 「ケースの場合」で Errno::ECONNRESET クラスをキャッチする方法を参照してください。私の答えが間違っている可能性があるため、ナキロンが述べたように。

于 2010-10-11T17:11:26.490 に答える