`do` ...`end`语句如何在没有块参数的情况下工作?

Fra*_*nk 4 ruby codeblocks local-variables

例如,在Rails gemfile中:

group :development, :test do
  gem 'rspec-rails', '~> 2.0'
end
Run Code Online (Sandbox Code Playgroud)

正在发生的事情与do... end语句?并与rspec:

describe "Foo" do
  context "bar" do
     expect...
  end
end
Run Code Online (Sandbox Code Playgroud)

do... end-s创建一个块,其间的信息正在其他地方使用?如果没有设置块参数,它如何工作?

Rus*_*nov 5

这称为域特定语言

域特定语言或DSL是"专注于特定域的有限表现力的编程语言".通过删除特定任务的无关代码并允许您专注于手头的特定任务,它可以使其域中的任务更容易.它还可以帮助其他人阅读代码,因为代码的目的是如此清晰.

基本上这个

group :development, :test do
  gem 'rspec-rails', '~> 2.0'
end
Run Code Online (Sandbox Code Playgroud)

只是调用group带有参数:development, :test和块的方法gem 'rspec-rails', '~> 2.0'.在Bundler DSL中以这种方式定义:

def group(*args, &blk)
  ...
end
Run Code Online (Sandbox Code Playgroud)

第二个例子也是如此.

DSL定义了对示例进行分组的方法,最明显的是描述,并将它们公开为RSpec的类方法.

.describe正在以这种方式实施:

def describe(doc_string, *metadata_keys, metadata = {}, &example_implementation)
  ...
end
Run Code Online (Sandbox Code Playgroud)

您可以在这篇thinkbot.com文章中阅读有关在Ruby 编写特定于域的语言的更多信息