gpt4 book ai didi

ruby-on-rails - define_method 如何使用在其外部初始化的变量

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

class Temp1
def add(s)
match = 'test'
self.class.class_eval do
define_method(s) do
puts match
end
end
#match ='haha'
end
end

正如我所想,'match' 是一个局部变量,所以我不明白它如何从另一个方法看到它,而且如果取消注释 #match ='haha',方法将以某种方式打印 'haha'。谁能解释一下?

此外,我在这里看不到使用 class_eval 或 instance_eval 之间的区别,似乎它们做同样的事情。

最后但同样重要的是,我可以在这里使用 define_method 创建类方法吗?所以我可以将它称为 Temp1.something 而不是 Temp1.new.something?

最佳答案

因为 block (do...end) 是闭包并且可以访问它们的周边范围。

您将 block 与 class_eval 一起使用,因此它可以访问其周围环境,这是方法 add 的范围。现在您使用另一个带有 define_method 的 block ,它也可以通过带有 class_eval 的 block 访问方法 add 的范围。 match 局部变量已在方法 add 的范围内创建。因此 block 可以访问变量。

And, at last but not least, can I create class method here using define_method?

不,你不能。 define_method 在接收器中定义一个实例方法self.classTemp1。现在在 Temp1.class_eval do..end 下,您正在使用方法 define_method 定义类 Temp1 的实例方法。define_method 是所有类的私有(private)类方法,其中存在祖先链Object类。

class C;end
C.private_methods.grep(/define_/)
# => [:define_method]

Also, i don't see difference here between using class_eval or instance_eval, seems like it do the same thing.

好的!让我为你解释。您看不出这里的区别,因为 Teamp1 是一个 Class 也是 Class 的一个实例。在 class_evalinstance_eval 这两个调用中,self 被设置为 Teamp1,根据它们各自的定义,如文档所述。

class C
def self.bar;11;end
def baz;12;end
end

C.is_a? Class # => true
C.instance_of? Class # => true

C.class_eval{ bar } # => 11
C.instance_eval{ bar } # => 11

希望这对您有所帮助!

关于ruby-on-rails - define_method 如何使用在其外部初始化的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19742889/

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