Ruby类如何从Object Object

时间:2017-01-27 03:42:01

标签: ruby inheritance

查看Ruby docs,我看到类Object中的实例方法包含在模块Kernel中。

但这一行来自an article

  

BasicObject类是Ruby中所有类的父类。因此,除非明确覆盖,否则其方法可用于所有对象。在Ruby 1.9之前,Object类是类层次结构的根。新类BasicObject用于此目的,Object是BasicObject的子类。 BasicObject是一个非常简单的类,几乎没有自己的方法。在Ruby中创建类时,除非明确指定超类,否则扩展Object,并且大多数程序员永远不需要使用或扩展BasicObject。

说创建一个类是扩展Object

我对extend的了解是,它会将模块所拥有的实例方法转换为可以与类方法相同的方式实现的方法。

这是否意味着它在技术上延伸Kernel而不是包括何时构建一个类?

如果是这种情况,那该怎么办?

3 个答案:

答案 0 :(得分:1)

大多数人都将extend理解为向类/模块添加类方法。

module Foo
  def something
    puts "Foo#something"
  end
end

class Bar
  extend Foo
end

2.3.0 :019 > Bar.something
Foo#something
=> nil

Ruby中的类实际上是Class类型的对象。所以 当你extend一个类的模块时,你将所有实例方法从模块添加到类对象。

这也可以在普通对象上完成。

2.3.0 :020 > Bar.new.something
NoMethodError: undefined method 'something' for #<Bar:0x007fdc220b74c0>
2.3.0 :022 > b = Bar.new.extend Foo
 => #<Bar:0x007fdc220bd280>
2.3.0 :023 > b.something
Foo#something
 => nil

从对象的角度回到课程

2.3.0 :010 > Baz = Class.new
 => Baz
2.3.0 :011 > Baz.methods - Object.methods
 => []
2.3.0 :012 > Baz.extend Foo
 => Baz
2.3.0 :013 > Baz.methods - Object.methods
 => [:something]
2.3.0 :014 >

答案 1 :(得分:-1)

简单来说,Object类与内核模块混合使用标准内核方法可访问性,BasicObject类与内核模块混合,几乎没有定义方法。因此,当您需要一个非常简单的类,它具有简单的层次结构,而不是所有内核方法的负担时,您将直接从BasicObject继承。

当你没有继承任何类时,它默认继承Object类,而后者依次继承BasicObject类,从而间接继承BasicObject类。当您继承任何类(BasicObject除外)类时,您的父类将继承Object类,因此您仍然保留在同一个ruby层次结构中。 BasicObject及其子类(不是通过Object)为您提供了一种远离默认ruby层次结构的方法,使您可以简单地使用它。

请参阅this post,您会发现它很有用。

答案 2 :(得分:-1)

你的困惑是合理的。

该博客文章的术语错误。

他们的意思是说

  

...当你在Ruby中创建一个类时,继承自 Object,除非你明确指定了超类,并且大多数程序员永远不需要使用或继承自 em> BasicObject。

强调我的。

使用&#34;扩展&#34;你是对的。在这种情况下没有意义。类继承彼此,模块可以扩展类。这是两种根本不同的关系!

也许还有其他一些编程语言,扩展类的类是适当的术语,但在Ruby中使用该语言肯定是错误的。

作者的意思是

 class A
 end

自动暗示

 class A < Object
 end

希望澄清你的困惑。

如果我可以推荐,也许最好拿一本书来学习Ruby?

书籍通常不会出现类似的术语错误,因为在出​​版书籍之前,编辑团队已对其内容进行了审核。在你掌握了从博客文章中学习语言的基础知识之后很酷,因为你可以自己发现这样的错误,但是当你还在忙碌时a book from a trusted publisher可能是你最好的指导。