查看Ruby docs,我看到类Object
中的实例方法包含在模块Kernel
中。
但这一行来自an article:
BasicObject类是Ruby中所有类的父类。因此,除非明确覆盖,否则其方法可用于所有对象。在Ruby 1.9之前,Object类是类层次结构的根。新类BasicObject用于此目的,Object是BasicObject的子类。 BasicObject是一个非常简单的类,几乎没有自己的方法。在Ruby中创建类时,除非明确指定超类,否则扩展Object,并且大多数程序员永远不需要使用或扩展BasicObject。
说创建一个类是扩展类Object
。
我对extend
的了解是,它会将模块所拥有的实例方法转换为可以与类方法相同的方式实现的方法。
这是否意味着它在技术上延伸Kernel
而不是包括何时构建一个类?
如果是这种情况,那该怎么办?
答案 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可能是你最好的指导。