web-dev-qa-db-ja.com

Rubyクラスタイプとcaseステートメント

違いは何ですか

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番目のものは機能し、最初のものは機能しません。どうして?それを行うための「適切な」方法はどれですか?

124
David Hollman

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

case item
when MyClass
...

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

208
Nakilon

ええ、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で使用できることを理解する

54
Fred

次を使用できます。

case item.class.to_s
    when 'MyClass'

...次のねじれが不可能な場合:

case item
    when MyClass

これは、case===を使用し、 ===演算子が記述する関係がnot commutative 。たとえば、5Integerですが、Integer5?です。これは、case/whenの考え方です。

9
user664833

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

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

MyClass.classMyClassオブジェクトのクラスです(説明するタイプClassのオブジェクトのclassMyClass.new)を使用して作成されたオブジェクト。つまり、MyClass.class == Class

5
Ken Bloom

item変数の性質に依存します。オブジェクトのインスタンスの場合、たとえば.

t = 5

それから

t.class == Fixnum

ただし、それ自体がクラスの場合

t = Array

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

t.class == Class

[〜#〜] edit [〜#〜]「case when」でErrno :: ECONNRESETクラスをキャッチする方法を参照してください。 ? 私の答えが間違っている可能性があるため、ナキロンが述べたように。

1
Jack