gpt4 book ai didi

ruby - 为什么我的 define_method 内容在类范围内被评估?

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

我正在做一些(太)花哨的元编程,我很难理解为什么在以下两种情况下范围不同:

案例 1:

class TesterA

def the_method
puts "I'm an instance_method!"
end

def self.the_method
puts "I'm a class_method!"
end

def self.define_my_methods *method_names
method_names.each do |name|
define_method("method_#{name}") do
the_method
end
end
end

define_my_methods :a, :b, :c
end

t = TesterA.new
t.method_a #=> I'm an instance_method!
t.method_b #=> I'm an instance_method!
t.method_c #=> I'm an instance_method!

案例二

class TesterB

def the_method
puts "I'm an instance_method!"
end

def self.the_method
puts "I'm a class_method!"
end

def self.define_the_method attr
define_method("method_#{attr}") do
begin
yield
rescue
raise $!, "method_#{attr} was called: #$!", $@
end
end
end

def self.define_my_methods *method_names
method_names.each do |name|
define_the_method(name) do
the_method
end
end
end

define_my_methods :a, :b, :c
end

t = TesterB.new
t.method_a #=> I'm a class_method!
t.method_b #=> I'm a class_method!
t.method_c #=> I'm a class_method!

在第二个示例中,我介绍了一种“辅助方法”define_the_method,我用它来定义方法,而不是 define_method 它自己。这样做的原因是,我想将动态方法的名称附加到这些方法中可能出现的任何异常消息。然而,问题是,内容(当使用后一种情况时)似乎是在类范围内评估的。

这是为什么,我怎样才能让它在实例范围内被评估?

最佳答案

这个 block :

do
the_method
end

它在类范围内定义和限定范围。没有理由期望它会以某种方式注入(inject)实例范围。要解决此问题,只需显式传递接收器即可:

yield(self)

和:

def self.define_my_methods *method_names
method_names.each do |name|
define_the_method(name) do |receiver|
receiver.the_method
end
end
end

关于ruby - 为什么我的 define_method 内容在类范围内被评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45958297/

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