测验问题:
以下关于 Ruby 中的类的说法正确的是?
Array
是 的一个实例Class
。- 当
self
在实例方法的定义中使用时,它指的是类的当前实例。- Ruby 支持多重继承。
- 实例化该类的实例后,不能重新定义该类的公共方法。
不止一个答案可能是正确的。
我知道 (3) 是不正确的,因为 Ruby 不支持多重继承。我选择了(1),但问题错了。关于 Ruby 中的类的其他陈述是否也是正确的?
#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
另一方面,正如@Priti 在下面的评论中正确指出的那样,Array 是Class的一个实例:
Array.instance_of? Class
# => true
因此,虽然 Array 没有从其祖先链中的 Class 继承,但它(严格来说)是 Class 的一个实例。这使得#1 在技术上是正确的。
self方法实际上比人们想象的要复杂一些。Ruby 1.9 是这样定义的:
self 是“当前对象”,是消息(方法调用)的默认接收者,没有指定明确的接收者。哪个对象扮演 self 的角色取决于上下文。
- 在方法中,调用该方法的对象是 self
- 在类或模块定义中(但在其中包含的任何方法定义之外),self 是正在定义的类或模块对象。
- 在与调用 class_eval(又名 module_eval)相关的代码块中,self 是调用该方法的类(或模块)。
- 在与调用 instance_eval 或 instance_exec 相关的块中,self 是调用该方法的对象。
所以,#2 是正确的,但只讲述了故事的一部分。
Ruby 支持开放类(参见Classes are Open),因此您可以在运行时重新定义实例和类方法。所以,#4 是错误的。
虽然所有其他答案都在解释每个选项,但我认为Array 是 Class 的一个实例。是真的。对象#instance_of? 说:如果 obj 是给定类的实例,则返回 true。另请参见 Object#kind_of?。
Array.instance_of? Class # => true
2也是正确的。Self 在许多语言中都是这样工作的。 http://ruby-doc.org/docs/keywords/1.9/Object.html
1、2、3 为真。Array
是 , 的一个实例Class
,self
它始终是接收者,并且 Ruby 确实支持多重 mixin 继承。4 为假,方法可以随时添加、删除和修改。