Ruby类属性

use*_*408 4 ruby class

测验问题:

关于Ruby中的类的以下哪些陈述是正确的?

  1. Array是一个实例Class.
  2. self实例方法的定义中使用时,它引用类的当前实例.
  3. Ruby支持多重继承.
  4. 在实例化该类的实例后,无法重新定义类的公共方法.

不止一个答案可能是正确的.

我知道(3)是不正确的,因为Ruby不支持多重继承.我选择了(1)但问题不对.关于Ruby中的类的其他陈述是否也是正确的?

Tod*_*obs 9

TL; DR

#1和#2都是正确的答案.你已经知道的Ruby不支持多重继承,但它的确支持模块的混入.所以,3和4是假的,而1和2是真的; 详见下文.

Array.is_a?类

首先,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是错的.

  • *Array是Class的一个实例.*我认为它是*true*.`Array.instance_of?Class#=> true`. (2认同)