В отличие от способа, например, функций Java, когда вы определяете классы в Ruby, Ruby фактически выполняет код. Это похоже на статические блоки Java. Поэтому, когда вы делаете это, например,
class Foo
puts(self)
end
вы откроете класс (то есть изменить текущий self
к Foo
), в его контексте сделать puts
(который выведет объект Foo
класса), а затем закрыть класс (возвращение self
к чему это был раньше).
get
- это метод, определенный на Sinatra::Base
. Таким образом, ваш код на самом деле интерпретируется как если бы это было
class Something < Sinatra::Base
self.get('/') do
'hello world'
end
end
Поскольку self
(т.е. Foo
) наследует от Sinatra::Base
, это метод мы вызовом - и мы делаем это как определение Something
класса читается ,
Что этот метод делает, грубо говоря, содержит таблицу «вещей, которые нужно делать, когда приходит запрос GET». Он помнит, что когда он видит URL /
, он должен сделать блок do "hello world" end
; более или менее, как это (пример кода, оригинал немного сложнее):
class Sinatra::Base
WHAT_TO_DO_ON_GET = {}
def self.get(url, &thing_to_do)
WHAT_TO_DO_ON_GET[url] = thing_to_do
end
end
Среда Sinatra просто цикл, который, когда запрос GET приходит, смотрит вверх URL против THINGS_TO_DO_ON_GET
и выполняет то, что там находит.