2

我看到如下所示的 ruby​​ 代码。这似乎是用于创建配置或设置的某种习惯用法,但我不太明白。另外,Application.configure这段代码的部分看起来如何?

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

2 回答 2

4

首先,这种配置方式并不是 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( configis a method) 设置为某个值,同样config.something = foo在内部执行configure

您可以在此处以及这本好书上了解更多关于yield 的信息。

于 2012-06-03T19:05:55.030 回答
2

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!

于 2012-06-03T18:51:48.883 回答