测验问题:
以下哪些关于Ruby中的类的陈述是正确的?
- 的一个实例
Array
是Class
。- 在实例方法的定义中使用
self
时,它引用该类的当前实例。- Ruby支持多重继承。
- 在实例化该类的实例后,无法重新定义类的公共方法。
醇>
不止一个答案可能是正确的。
我知道(3)是不正确的,因为Ruby不支持多重继承。我选择了(1)但问题不对。关于Ruby中的类的其他陈述是否也是正确的?
答案 0 :(得分:9)
#1和#2都是正确答案。您已经知道Ruby不支持多重继承,尽管它 支持模块mixin。所以,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是&#34;当前对象&#34;以及未指定显式接收器的消息的默认接收者(方法调用)。哪个对象扮演自我的角色取决于上下文。
- 在方法中,调用该方法的对象是self
- 在类或模块定义中(但在其中包含的任何方法定义之外),self是要定义的类或模块对象。
- 在与class_eval(aka module_eval)调用相关联的代码块中,self是调用该方法的类(或模块)。
- 在与调用instance_eval或instance_exec相关联的块中,self是调用该方法的对象。
所以,#2是正确的,但只讲述故事的一部分。
Ruby支持开放类(请参阅Classes are Open),因此您可以在运行时重新定义实例和类方法。所以,#4错了。
答案 1 :(得分:3)
虽然所有其他答案都在解释每个选项,但我认为 Array是Class的一个实例。是 true 。Object#instance_of?说:返回如果obj是给定类的实例,则返回true。另请参见Object#kind_of?。
Array.instance_of? Class # => true
答案 2 :(得分:1)
2也是正确的。 Self在许多语言中都是这样的。 http://ruby-doc.org/docs/keywords/1.9/Object.html
答案 3 :(得分:0)
1,2和3是真的。 Array
是Class
的实例,self
始终是接收者,Ruby确实支持多个mixin继承。 4是错误的,可以在任何时间点添加,删除和修改方法。