Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 元编程:当我们调用在类方法中定义的实例方法时,方法分派看起来如何?_Ruby_Metaprogramming_Eigenclass - Fatal编程技术网

Ruby 元编程:当我们调用在类方法中定义的实例方法时,方法分派看起来如何?

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:是的,这些方法是在实例化时创

我正在阅读,只是想澄清一下以下解释代码:

Q1 我的第一个问题涉及文件末尾的两个方法调用:
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