#1和#2都是正确的答案.你已经知道的Ruby不支持多重继承,但它的确支持模块的混入.所以,3和4是假的,而1和2是真的; 详见下文.
首先,Array 是一个类,但不从Class继承或在其祖先中具有Class.考虑:
Array.is_a? Class
# => true
Array.ancestors
# => [Array, Enumerable, Object, PP::ObjectMixin, Kernel, BasicObject]
Array < Class
# => nil
Run Code Online (Sandbox Code Playgroud)
另一方面,正如@Priti在下面的评论中正确指出的那样,Array是Class的一个实例:
Array.instance_of? Class
# => true
Run Code Online (Sandbox Code Playgroud)
因此,虽然Array不会从其祖先链中的Class继承,但它(严格来说)是一个Class的实例.这使#1技术上正确.
该自助方法实际上是一个比较复杂的比人们预期.Ruby 1.9以这种方式定义它:
self是"当前对象"和消息的默认接收者(方法调用),没有指定明确的接收者.哪个对象扮演自我的角色取决于上下文.
- 在方法中,调用该方法的对象是self
- 在类或模块定义中(但在其中包含的任何方法定义之外),self是定义的类或模块对象.
- 在与class_eval(aka module_eval)的调用相关联的代码块中,self是调用该方法的类(或模块).
- 在与调用instance_eval或instance_exec相关联的块中,self是调用该方法的对象.
所以,#2是正确的,但只讲述了故事的一部分.
Ruby支持开放类(请参阅类是打开的),因此您可以在运行时重新定义实例和类方法.所以,#4是错的.