gpt4 book ai didi

ruby - 模块中的 instance_eval 与 class_eval

转载 作者:数据小太阳 更新时间:2023-10-29 07:10:56 24 4
gpt4 key购买 nike

class Foo
include Module.new { class_eval "def lab; puts 'm' end" }

def lab
super
puts 'c'
end
end

Foo.new.lab #=> m c

============================================= =========================

class Foo
include Module.new { instance_eval "def lab; puts 'm' end" }

def lab
super
puts 'c'
end
end

注意这里我把class_eval改成了instance_eval

Foo.new.lab rescue nil#=> no super class method lab
Foo.lab #=> undefined method lab for Foo class

所以看起来包含模块既没有定义实例方法也没有定义类方法。

有什么解释吗?

此代码在 mac 上的 ruby​​ 1.8.7 上进行了测试。

最佳答案

首先,想想include 做了什么。它使模块的 instance 方法被包含到包含类的 instance 方法中。即除了您的工作示例使用匿名模块这一事实外,它等效于:

module M1
def lab
puts 'm'
end
end

class Foo
include M1

def lab
super
puts 'c'
end
end

接下来,想一想 class_eval 做了什么。它在类或模块的上下文中评估给定的代码。也就是说,这就像您重新打开模块并键入传递给 class_eval 的代码一样。所以 MyModule = Module.new { class_eval "def lab; puts 'm' end"} 等同于

module MyModule
def lab
puts 'm'
end
end

希望这能解释有效的案例。

当您使用 instance_eval 时,您是在接收对象(在本例中为模块的实例)的上下文中评估代码,因此 MyMod2 = Module.new { instance_eval "def lab;把'm'结束"} 等同于

module MyMod2
def MyMod2.lab
puts 'm'
end
end

即它创建一个 module 方法,您可以通过 MyMod2.lab 调用该方法,并且此类方法不会通过 include 添加为实例方法。


请注意:这个答案借用了我写给 previous question asking about instance_eval vs. class_eval 的一个答案中的一些解释。与 The Ruby Programming Language 一书中的示例相关。您可能会发现该答案也有帮助。

关于ruby - 模块中的 instance_eval 与 class_eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3523536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com