Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将方法和对象直接传递到块中?_Ruby - Fatal编程技术网

Ruby 如何将方法和对象直接传递到块中?

Ruby 如何将方法和对象直接传递到块中?,ruby,Ruby,例如,在FactoryGirl中,它允许您执行以下操作 factory :user, :class => User do sequence :username do |n| "blahblah#{n}" end end factory ... do |f| f.sequence ... end 我已经在上浏览了源代码,但似乎无法理解他们是如何实现这一点的(它看起来像是某种类型的代理?)。也就是说,我们如何能够访问序列方法?他们正在使用 这意味着在块内self(因此调

例如,在FactoryGirl中,它允许您执行以下操作

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