Ruby 元编程:当我们调用在类方法中定义的实例方法时,方法分派看起来如何?
我正在阅读,只是想澄清一下以下解释代码: Q1 我的第一个问题涉及文件末尾的两个方法调用:Ruby 元编程:当我们调用在类方法中定义的实例方法时,方法分派看起来如何?,ruby,metaprogramming,eigenclass,Ruby,Metaprogramming,Eigenclass,我正在阅读,只是想澄清一下以下解释代码: Q1 我的第一个问题涉及文件末尾的两个方法调用:My_class\u method:foo和My_class\u method:bar。我认为在实例化MyClazz对象时,它们都会自动调用,这对吗 Q2当Ruby生成这些方法(def foo和def bar)时,它会将它们放在MyClazz的特征类中,即使它们是实例方法。那么这是否意味着Ruby在需要时会同时为类和实例方法寻找特征类呢 我只是想在深入到这本书之前澄清一下。A1:是的,这些方法是在实例化时创
My_class\u method:foo
和My_class\u method:bar
。我认为在实例化MyClazz对象时,它们都会自动调用,这对吗
Q2当Ruby生成这些方法(def foo
和def bar
)时,它会将它们放在MyClazz的特征类中,即使它们是实例方法。那么这是否意味着Ruby在需要时会同时为类和实例方法寻找特征类呢
我只是想在深入到这本书之前澄清一下。A1:是的,这些方法是在实例化时创建的 答:罗斯·奥尔森在他的《雄辩的红宝石》一书中对这一点做了很好的解释。特征类(或单例类)“位于每个对象及其常规类之间”。因此,当Ruby在实例方法中找不到它要查找的方法时,它将开始沿着继承树向上移动。下一站是特征类,然后是类本身
Olsen还对新类和类对象之间的所有类方法实际上是怎样的单例方法进行了有趣的讨论 A1:是的,这些方法是在实例化时创建的 答:罗斯·奥尔森在他的《雄辩的红宝石》一书中对这一点做了很好的解释。特征类(或单例类)“位于每个对象及其常规类之间”。因此,当Ruby在实例方法中找不到它要查找的方法时,它将开始沿着继承树向上移动。下一站是特征类,然后是类本身
Olsen还对新类和类对象之间的所有类方法实际上是怎样的单例方法进行了有趣的讨论 答案1:(简短)当ruby实例化
MyClass
实例(类型为Class
)时会调用它们
(long)当Ruby解释器看到一个类定义(classmyclazz
)时,它实例化这个类的一个实例,并计算类定义中的所有代码
在您的例子中,MyClazz
是一个常量,它保存对类class
对象的引用。当Ruby初始化它时,它会在类定义中执行代码——定义这个类实例的单例方法my_class_方法
,并在这个类实例的上下文中执行方法my_class_方法
两次
答案2:(简称)模块#define_method
私有方法将方法添加到类
实例的方法表中(方法表包含该类的实例方法)。它不影响距离对象/类对象的特征类
(long)当您在对象上调用实例方法时,Ruby首先在该对象的本征类中查找该方法,然后在本征类的超类中查找(它将是对象类的类
对象)。但它不会出现在MyClazz
反对
示例:
obj = MyClazz.new
obj.foo # => ok
obj.foo
将在obj
对象的特征类中查找foo
方法定义,然后将查找MyClass
的实例方法(类的实例class
),然后在MyClass
对象的超类中(在您的例子中,这是object
类)等
MyClass.my_class_method
将在MyClass
对象的特征类中查找my_class_method
方法定义(旁注:类的特征类有时是
它将在这里找到它,并将baz
实例方法添加到类MyClass
答案1:(简称)当ruby实例化MyClass
实例(类型class
)时调用它们
(long)当Ruby解释器看到一个类定义(classmyclazz
)时,它实例化这个类的一个实例,并计算类定义中的所有代码
在您的例子中,MyClazz
是一个常量,它保存对类class
对象的引用。当Ruby初始化它时,它会在类定义中执行代码——定义这个类实例的单例方法my_class_方法
,并在这个类实例的上下文中执行方法my_class_方法
两次
答案2:(简称)模块#define_method
私有方法将方法添加到类
实例的方法表中(方法表包含该类的实例方法)。它不影响距离对象/类对象的特征类
(long)当您在对象上调用实例方法时,Ruby首先在该对象的本征类中查找该方法,然后在本征类的超类中查找(它将是对象类的类
对象)。但它不会出现在MyClazz
反对
示例:
obj = MyClazz.new
obj.foo # => ok
obj.foo
将在obj
对象的特征类中查找foo
方法定义,然后将查找MyClass
的实例方法(类的实例class
),然后在MyClass
对象的超类中(在您的例子中,这是object
类)等
MyClass.my_class_method
将在MyClass
对象的特征类中查找my_class_method
方法定义(旁注:类的特征类有时是
它将在这里找到它,并将baz
实例方法添加到类MyClass
谢谢你的提示,我将阅读Russ Olsen的书
obj = MyClass.new
MyClass.my_class_method :baz
obj.baz # => ok