我看到如下所示的 ruby 代码。这似乎是用于创建配置或设置的某种习惯用法,但我不太明白。另外,Application.configure
这段代码的部分看起来如何?
MyApp::Application.configure do
config.something = foo
config.....
config....
.
config....
end
我看到如下所示的 ruby 代码。这似乎是用于创建配置或设置的某种习惯用法,但我不太明白。另外,Application.configure
这段代码的部分看起来如何?
MyApp::Application.configure do
config.something = foo
config.....
config....
.
config....
end
首先,这种配置方式并不是 Ruby 特有的;选择使用或不使用它的是应用程序(或库、gem)。
为了向您解释该代码的作用,我将以您的代码段为例:
MyApp::Application.configure do
config.something = foo
end
在这里,您正在调用MyApp::Application.configure
方法,没有参数。通话后,您给它一个block。
您可以将块视为一段代码,您可以随意使用它。
它们可以写成一行或多行:
{ puts 'hello' }
{ |param| puts param } # with passing it a param
# or
do |param|
puts param
end
(记得my_array.each do ... end
吗?这是你通过它的一个障碍。;))
现在,configure
由于yield
.
yield
使用(或执行)已传递给方法的块的指令。
示例:让我们定义一个内部带有 yield 的方法:
def hello
puts "Hello #{yield}"
end
如果你调用这个方法,你会得到一个'hello': no block given (yield) (LocalJumpError)'
.
你需要给它一个块:hello { :Samy }
.
结果将是Hello Samy
。如您所见,它只是使用了传递给方法的块中的内容。
这正是 Rails 配置代码中发生的事情。您只需将config.something
( config
is a method) 设置为某个值,同样config.something = foo
在内部执行configure
。
The part from "do" until "end" is called a block, and is getting passed to the configure
class method on Application
. (all ruby methods can accept arguments and a block)
so the Application.configure
method is creating a configuration object with a set of defaults, and then calling the block. The block is then setting the values you see, having the effect of overriding them.
It's then setting that configuration object as a class variable (like a global variable) so that other classes can use the configuration object later in the application lifecycle.
Hope that simplified description helps!