这个ruby代码如何用于设置配置

时间:2012-06-03 18:27:49

标签: ruby-on-rails ruby

我看到如下所示的ruby代码。它似乎是某种用于创建配置或设置的习惯用法,但我并不理解它。此外,此代码的Application.configure部分将如何显示?

MyApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end

2 个答案:

答案 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.somethingconfig是一种方法)设置为某个值,并在config.something = foo内执行相同的configure

您可以详细了解yield阻止 here以及此great book

答案 1 :(得分:2)

从“do”到“end”的部分称为块,并且传递给configure上的Application类方法。 (所有ruby方法都可以接受参数和块)

所以Application.configure方法正在创建一个带有一组默认值的配置对象,然后调用该块。然后该块设置您看到的值,具有覆盖它们的效果。

然后将该配置对象设置为类变量(如全局变量),以便其他类可以在应用程序生命周期的后期使用配置对象。

希望简化描述有帮助!