Ruby on rails define_方法如何使用在其外部初始化的变量

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)是闭包,可以访问它们的 周

在我看来,“match”是一个局部变量,所以我不明白它如何从另一个方法中看到它,另外,如果取消注释#match='haha',该方法将以某种方式打印“haha”。有人能解释一下吗

另外,我看不出使用class_eval或instance_eval有什么区别,似乎它做了同样的事情

最后,但并非最不重要的是,我可以在这里使用define_方法创建类方法吗?所以我可以把它叫做Temp1.something,而不是Temp1.new.something?

,因为块(do…end)是闭包,可以访问它们的 周围范围。

您将block与
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
,也是
的实例。在call
class_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