Sinatra的一个例子是:
require 'sinatra/base'
class MyApp < Sinatra::Base
set :sessions, true
set :foo, 'bar'
get '/' do
'Hello world!'
end
end
Sinatra如何允许“get'/'do”语法?它似乎不是一种方法,我不知道任何其他语法允许这样做。
答案 0 :(得分:2)
get '/'
指定应用程序的GET端点。如果你要启动服务器并转到localhost:port /,那么你会看到“Hello world!&#39;在页面上。
def get(path, opts = {}, &block)
conditions = @conditions.dup
route('GET', path, opts, &block)
@conditions = conditions
route('HEAD', path, opts, &block)
end
这是Sinatra的lib中的get方法。 get方法将路径作为参数,并将您路由到该路径。您也可以传入选项(opts),但在您的示例中没有完成。最后一个参数是一个块。这是do和end之间的部分。
答案 1 :(得分:2)
这在Ruby中称为"Internal Domain-Specific Language"。你调用的get
实际上是一个由Sinatra定义的方法,它采用一个块(这是你对get的实现)。
当你发现自己调用奇怪的方法,但仍然能够执行看似普通的Ruby代码时,你可能会使用内部DSL。例子包括Bundler的Gemfiles,Rake的Rakefiles,RSpec规范......