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番は間違っています。