无法理解Ruby的魔力

meg*_*gas 5 ruby ruby-on-rails railscasts

在railscasts项目中,您可以看到以下代码:

before(:each) do
  login_as Factory(:user, :admin => true)
end
Run Code Online (Sandbox Code Playgroud)

该函数的相应定义是:

Factory.define :user do |f|
  f.sequence(:github_username) { |n| "foo#{n}" }
end
Run Code Online (Sandbox Code Playgroud)

我无法理解admin参数如何传递给函数,而在函数中没有关于admin参数的消息.谢谢

Mic*_*ile 9

Factory.define它不是函数定义,它是一个采用符号或字符串(在本例中为用户)和定义您正在制作的工厂的块的方法. 使用admin属性Factory(:user, :admin => true)创建一个User对象.它没有调用你的第二个片段中的代码,它调用Factory()初始化工厂,并选择一个(在这种情况下是在第二个片段中定义的那个).然后它将散列形式的选项传递给Factory.

Factory选择:user非常通用的工厂.该选项:admin=>true只是告诉Factory将User上的admin实例变量设置为true.

This is actually what it is calling in factory.rb in factory girl

def initialize(name, options = {}) #:nodoc:
  assert_valid_options(options)
  @name = factory_name_for(name)
  @options = options
  @attributes = []
end
Run Code Online (Sandbox Code Playgroud)

因此,Factory(name,options)等同于此代码中的Factory.new(name,options).

http://www.ruby-doc.org/core/classes/Kernel.html 注意数组和字符串等具有类似的结构.我想弄清楚他们现在是怎么做到的.

即使对于体面的Ruby程序员来说,这也令人困惑.我强烈推荐"Metaprogramming Ruby"这本书可能是我在ruby中读过的最好的书,它告诉你很多关于这些神奇的东西.