Ruby on rails define_方法如何使用在其外部初始化的变量
在我看来,“match”是一个局部变量,所以我不明白它如何从另一个方法中看到它,另外,如果取消注释#match='haha',该方法将以某种方式打印“haha”。有人能解释一下吗 另外,我看不出使用class_eval或instance_eval有什么区别,似乎它做了同样的事情 最后,但并非最不重要的是,我可以在这里使用define_方法创建类方法吗?所以我可以把它叫做Temp1.something,而不是Temp1.new.something?,因为块(do…end)是闭包,可以访问它们的 周围范围。 您将block与Ruby on rails define_方法如何使用在其外部初始化的变量,ruby-on-rails,ruby,metaprogramming,Ruby On Rails,Ruby,Metaprogramming,在我看来,“match”是一个局部变量,所以我不明白它如何从另一个方法中看到它,另外,如果取消注释#match='haha',该方法将以某种方式打印“haha”。有人能解释一下吗 另外,我看不出使用class_eval或instance_eval有什么区别,似乎它做了同样的事情 最后,但并非最不重要的是,我可以在这里使用define_方法创建类方法吗?所以我可以把它叫做Temp1.something,而不是Temp1.new.something?,因为块(do…end)是闭包,可以访问它们的 周
class_eval
一起使用,因此它可以访问其周围环境,这是方法add
的范围。现在,您使用另一个带有define\u method
的块,该块还可以通过在方法add
范围内创建的带有class\u eval
match
局部变量的块访问方法add
。因此块可以访问变量
最后,但并非最不重要的是,我可以在这里使用define_方法创建类方法吗
不,你不能。定义接收器中的实例方法。self.class
是Temp1
。现在在Temp1.class\u eval do..end
下,您正在定义类Temp1
的实例方法,方法define\u method
是所有类的私有类方法,其中存在祖先链对象
类
class Temp1
def add(s)
match = 'test'
self.class.class_eval do
define_method(s) do
puts match
end
end
#match ='haha'
end
end
而且,我看不出使用或的区别,似乎它做同样的事情
好的!让我给你解释一下。您在这里看不到区别,因为Teamp1
是类
,也是类
的实例。在callclass_eval
和instance_eval
中,self
根据其各自的定义被设置为Teamp1
class C;end
C.private_methods.grep(/define_/)
# => [:define_method]
希望这有帮助
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