gpt4 book ai didi

Ruby 单例方法 (class_eval, define_method) vs (instance_eval, define_method)

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

Ruby 中的元编程很棒,因为我经常使用它来模拟基于原型(prototype)的编程,并快速编写一些问题的原型(prototype)解决方案来测试它们的可行性。所以我想知道下面这段代码是否有本质区别:

(class << some_object; self; end).class_eval do
define_method(:method_name) do ... method body ... end
end

(class << some_object; self; end).instance_eval do
define_method(:method_name) do ... method body ... end
end

代码的两个版本都定义了一个单例方法,我还没有遇到任何迫使我选择 (instance_eval, define_method) 组合而不是 (class_eval, define_method) 组合来定义单例方法,我想知道两者之间是否存在一些本质区别。

最佳答案

define_method 没有区别。但是当您使用 def 时会有所不同。

o = Object.new  

# class_eval example
class << o; self; end.class_eval { def test1; :test1; end }
o.test1 #=> test1

# instance_eval example
class << o; self; end.instance_eval { def test2; :test2; end }
o.test2 #=> NoMethodError

为什么 defdefine_method 之间的行为不同?define_method 是一个方法调用,因此在 eval 上下文中对 self 进行操作。 instance_evalclass_eval 中的 self 是相同的 - 它是接收者(o 的特征类)。

但是 def 的行为不同,它不对 self 操作,而是对 default define 操作.在 class_eval 的情况下,default defineeself 相同,但对于 instance_eval,它是 self

我们如何访问上面定义的test2方法? test2 必须是在 o 的特征类的元类上定义的实例方法。

它是o的特征类上的类方法:

class << o; test2; end #=> :test2

关于Ruby 单例方法 (class_eval, define_method) vs (instance_eval, define_method),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3170817/

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