Sinatra 如何允许其语法?

How does Sinatra allow its syntax?

Sinatra 的一个例子是这样的:

require 'sinatra/base'

class MyApp < Sinatra::Base
  set :sessions, true
  set :foo, 'bar'

  get '/' do
    'Hello world!'
  end
end

Sinatra 如何允许“get '/' do”语法?它似乎不是一种方法,而且我不知道任何其他允许这样做的语法。

get '/' 正在为您的应用程序指定 GET 端点。如果您要启动服务器并转到 localhost:port/,那么您会在页面上看到 'Hello world!'。

def get(path, opts = {}, &block)
  conditions = @conditions.dup
  route('GET', path, opts, &block)

  @conditions = conditions
  route('HEAD', path, opts, &block)
end

这是Sinatra库中的get方法。 get 方法将路径作为参数并将您引导至该路径。您还可以传递选项 (opts),但您的示例中并未这样做。最后一个参数是一个块。这是做和结束之间的部分。

这在 Ruby 中称为 "Internal Domain-Specific Language"get 你调用的实际上是一个由 Sinatra 定义的方法,它需要一个块(这是你对 get 的实现)。

当您发现自己调用了看起来很奇怪的方法,但仍然能够执行看似正常的 Ruby 代码时,您可能正在使用内部 DSL。示例包括 Bundler 的 Gemfiles、Rake 的 Rakefiles、RSpec 规范...