4

测验问题:

以下关于 Ruby 中的类的说法正确的是?

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

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

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

4

4 回答 4

9

TL;博士

#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

另一方面,正如@Priti 在下面的评论中正确指出的那样,Array 是Class的一个实例:

Array.instance_of? Class
# => true

因此,虽然 Array 没有从其祖先链中的 Class 继承,但它(严格来说)是 Class 的一个实例。这使得#1 在技术上是正确的。

对象#self

self方法实际上比人们想象的要复杂一些。Ruby 1.9 是这样定义的:

self 是“当前对象”,是消息(方法调用)的默认接收者,没有指定明确的接收者。哪个对象扮演 self 的角色取决于上下文。

  • 在方法中,调用该方法的对象是 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 的一个实例。真的对象#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 回答
0

1、2、3 为真。Array是 , 的一个实例Classself它始终是接收者,并且 Ruby 确实支持多重 mixin 继承。4 为假,方法可以随时添加、删除和修改。

于 2013-07-23T05:05:33.333 回答