Ruby 如何将方法和对象直接传递到块中?
例如,在FactoryGirl中,它允许您执行以下操作Ruby 如何将方法和对象直接传递到块中?,ruby,Ruby,例如,在FactoryGirl中,它允许您执行以下操作 factory :user, :class => User do sequence :username do |n| "blahblah#{n}" end end factory ... do |f| f.sequence ... end 我已经在上浏览了源代码,但似乎无法理解他们是如何实现这一点的(它看起来像是某种类型的代理?)。也就是说,我们如何能够访问序列方法?他们正在使用 这意味着在块内self(因此调
factory :user, :class => User do
sequence :username do |n|
"blahblah#{n}"
end
end
factory ... do |f|
f.sequence ...
end
我已经在上浏览了源代码,但似乎无法理解他们是如何实现这一点的(它看起来像是某种类型的代理?)。也就是说,我们如何能够访问序列
方法?他们正在使用
这意味着在块内self
(因此调用了对象sequence
)不是它本来的样子(在本例中可能是顶级对象),而是调用了实例_eval
的对象(在本例中是实现factory girl语法构造的对象)
它经常与DSL一起使用(另一个例子是rails>=3中的routes.rb文件),因为如果没有它,您必须执行以下操作
factory :user, :class => User do
sequence :username do |n|
"blahblah#{n}"
end
end
factory ... do |f|
f.sequence ...
end
这往往会分散DSL的注意力
一个小例子说明了它的影响
foo = "123456"
foo.instance_eval do
length
end
#=> 6
对于“normal”块,这将引发一个错误,因为顶级对象没有length
方法,但是因为使用了instance\u eval
,所以对字符串调用length