Ruby类属性

时间:2013-07-22 23:00:25

标签: ruby class

测验问题:

  

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

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

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

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

4 个答案:

答案 0 :(得分:9)

TL; DR

#1和#2都是正确答案。您已经知道Ruby不支持多重继承,尽管它 支持模块mixin。所以,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方法实际上比人们预期的要复杂一些。 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是真的。 ArrayClass的实例,self始终是接收者,Ruby确实支持多个mixin继承。 4是错误的,可以在任何时间点添加,删除和修改方法。