4

クイズ問題:

Ruby のクラスに関する次の記述のうち、正しいものはどれですか?

  1. ArrayのインスタンスですClass
  2. selfインスタンス メソッドの定義内で使用される場合、クラスの現在のインスタンスを参照します。
  3. Ruby は多重継承をサポートしています。
  4. クラスのインスタンスがインスタンス化された後は、そのクラスのパブリック メソッドを再定義することはできません。

複数の答えが正しい可能性があります。

Ruby は多重継承をサポートしていないため、(3) が正しくないことはわかっています。(1)を選びましたが、問題を間違えました。Ruby のクラスに関する他の記述も正しいですか?

4

4 に答える 4

9

TL;DR

#1と#2はどちらも正解です。Ruby はモジュール mixin をサポートしてますが、多重継承をサポートしていないことは既にご存じでしょう。したがって、3 と 4 は false ですが、1 と 2 は true です。詳細については、以下を参照してください。

Array.is_a? クラス

まず、Arrayクラスですが、Class から継承したり、祖先に Class を持ったりしません。検討:

Array.is_a? Class
# => true

Array.ancestors
# => [Array, Enumerable, Object, PP::ObjectMixin, Kernel, BasicObject]

Array < Class
# => nil

一方、@Priti が以下のコメントで正しく指摘しているように、Array は Class のインスタンスです。

Array.instance_of? Class
# => true

したがって、Array は祖先の連鎖で Class から継承されませんが、(厳密に言えば) Class のインスタンスです。それは#1を技術的に正しいものにします。

オブジェクト#自己

selfメソッドは、実際には予想よりも少し複雑です。Ruby 1.9 では、次のように定義されています。

self は「現在のオブジェクト」であり、明示的なレシーバーが指定されていないメッセージ (メソッド呼び出し) のデフォルトのレシーバーです。どのオブジェクトが自己の役割を果たすかは、コンテキストによって異なります。

  • メソッドでは、メソッドが呼び出されたオブジェクトは自分自身です
  • クラスまたはモジュール定義 (ただし、そこに含まれるメソッド定義の外側) では、self は定義されているクラスまたはモジュール オブジェクトです。
  • class_eval (別名 module_eval) の呼び出しに関連付けられたコード ブロックでは、self はメソッドが呼び出されたクラス (またはモジュール) です。
  • instance_eval または instance_exec の呼び出しに関連付けられたブロックでは、self はメソッドが呼び出されたオブジェクトです。

したがって、#2 は正しいですが、ストーリーの一部しか伝えていません。

オープンクラス

Ruby はオープン クラスをサポートしているため ( Classes are Openを参照)、実行時にインスタンス メソッドとクラス メソッドを再定義できます。というわけで、4番は間違っています。

于 2013-07-22T23:24:38.377 に答える
3

他のすべての回答は各オプションを説明していますが、 Array は Class のインスタンスだと思います。本当です。Object#instance_of? 言います: obj が指定されたクラスのインスタンスである場合、true を返します。Object#kind_of? も参照してください。

   Array.instance_of? Class # => true
于 2013-07-23T04:23:12.840 に答える
1

2も正解です。Self は多くの言語でこのように機能します。 http://ruby-doc.org/docs/keywords/1.9/Object.html

于 2013-07-22T23:09:59.547 に答える