我正在阅读'红宝石中的元编程'
这是一本优秀的书。说真的,它谈到了我从未听过其他地方提到过的东西。
我有一些关于对象的具体问题(我在前几章中)
我知道RubyGems gem将方法'gem'安装到模块Kernel,以便它显示在每个对象上。他们没有把它放入Object类吗?
他谈到了红宝石如何寻找它总是正确的方法。 'up'究竟是什么意思?我在图中看到它,它只是我不明白'up'的目的。他没有解释那部分内容。
Object类有什么意义?为什么这些方法不能被放入课堂?如果每个对象都属于一个类(即使它的类),那么对象,基本对象和内核的重点是什么?
String,Array,blah blah显然是Class的一个实例。类也是它自己的一个实例。所以如果Class是Class的一个实例......它是如何继承Object的呢?代码中的哪个位置与BOTH类和对象有关?
我知道内核包含可以在任何地方使用的put之类的方法,这与问题1有关,但为什么它们只是压缩它并将它全部放入Object ...它似乎一切都继承自无论如何对象
答案 0 :(得分:2)
两者都可以,但通常Object
上的方法应该只是处理特定对象的方法。在Kernel
模块中设置内容不是关于对象而是更全局。
我认为这意味着“继承链”。所以它在子类上查找该方法,然后在该类上查找父类,直到找到一个或用完父类。
Object
是所有对象的基类,自然是(至少对于ruby 1.8)。疯狂的部分是一个类实际上是Class
类的一个实例。 (你遵循那个?)因此,向Class
添加实例方法会将方法添加到类对象中,但不会添加这些类的实例。
红宝石中几乎所有东西都是物体。 Class.superclass
实际上是Module
(就像您无法实例化的类)而Module.superclass
会返回Object
。所以Class < Module < Object
是Class
类的继承链。 (至少为红宝石1.8)
比任何事情更多的约定。由于Object
可能会变得相当巨大,因此习惯上将事物放入模块中,然后再将这些模块组合起来。如果方法不直接将对象的实例作为self
处理,则该方法不直接属于Object
。更多全局非对象实例方法(如gem
)会放在Kernel
模块中,表示它们只是可用的方法。
关于类对象和继承的更多内容......
class Foo < Bar
def hi
puts 'Hi!'
end
end
这样做真的非常棒。当然,它定义了一个类对象。现在,此类对象配置为具有名称Foo
,父类Bar
和方法hi
。此信息有点像此类对象的元数据。
现在,类对象Foo
本身是 Class
的实例。但是Foo
定义一个继承自Bar
的类。 Class
类定义了一个数据结构来存储关于类的元数据。
您可以认为Class
类的排序有点像这样定义:
class Class < Module
# fictional method called on class creation
def set_meta_data(name, superclass, methods)
@name = name
@superclass = superclass
@methods = methods
end
# fictional way in which an instance might be created
def new
instance = Object.new
instance.superclass = @superclass
instance.addMethods(@methods)
instance
end
end
因此,类对象本身将从Class
继承,但它会创建不具有的对象。
将类视为对象可能会以这种方式弯曲,但这也是红宝石很棒的原因。
答案 1 :(得分:1)
对于1和5,伪关键字命令倾向于进入内核而不是对象。
对于2,子类相对于它们的父类是“向下”是有意义的(子字面意思是“在下面”)。因此,如果您要前往父母班级及其祖先,您必须“向上”。
对于3,object
对象不是Class
的实例,它是Object
的实例。
对于4,什么是Class的实例并从Object继承有什么问题?所有类都继承自Object。