我看到如下所示的ruby代码。它似乎是某种用于创建配置或设置的习惯用法,但我并不理解它。此外,此代码的Application.configure
部分将如何显示?
MyApp::Application.configure do
config.something = foo
config.....
config....
.
config....
end
答案 0 :(得分:4)
首先,该配置方式并非特定于Ruby;它是选择使用它的应用程序(或库,gems)。
为了向您解释该代码的作用,我将以您的代码为例:
MyApp::Application.configure do
config.something = foo
end
在这里,您正在调用MyApp::Application.configure
方法,没有参数。通话结束后,您将为其提供块。
您可以将块视为您可以随意使用的一段代码。
它们可以用一行或多行写成:
{ 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
是一种方法)设置为某个值,并在config.something = foo
内执行相同的configure
。
您可以详细了解yield
和阻止 here以及此great book。
答案 1 :(得分:2)
从“do”到“end”的部分称为块,并且传递给configure
上的Application
类方法。 (所有ruby方法都可以接受参数和块)
所以Application.configure
方法正在创建一个带有一组默认值的配置对象,然后调用该块。然后该块设置您看到的值,具有覆盖它们的效果。
然后将该配置对象设置为类变量(如全局变量),以便其他类可以在应用程序生命周期的后期使用配置对象。
希望简化描述有帮助!