Ruby Sinatra如何允许其语法?

Ruby Sinatra如何允许其语法?,ruby,sinatra,Ruby,Sinatra,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

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方法将路径作为参数,并将您路由到该路径。您还可以传入选项选项,但在您的示例中没有这样做。最后一个参数是块。这是do和end之间的部分。

这在Ruby中称为an。您正在调用的get实际上是一个由Sinatra定义的方法,它接受一个块,该块是get的实现


当您发现自己在调用外观古怪的方法,但仍然能够执行看似普通的Ruby代码时,您可能使用的是内部DSL。示例包括Bundler的Gemfiles、Rake的Rakefile、RSpec规范……

但这并没有回答我的问题——我想知道Sinatra是如何允许这种语法的,而不是它的功能。你比我强。看看是什么让你觉得这不是一种方法?它的调用方式与任何其他方法完全相同,它看起来与任何其他方法完全相同,它实际上是一个方法。在我所知的所有其他语言中,它都位于类内部,类主体不允许执行代码,只允许成员变量和方法声明。那么,所有这些类内代码是在什么上下文中执行的,什么时候执行的?Ruby几乎在任何地方都允许“可执行”代码,包括类定义