2014-08-25 5 views
2

Я работаю с Sinatra, но я совершенно новичок в Ruby и смущен тем, что на самом деле делает настоящий код.Как этот рубиновый «метод» работает?

Мы, похоже, не определяем метод. Называем ли мы метод get? Если да, то в какое время это называется? Я не видел ничего подобного на других языках.

Если бы у нас было 2 класса, которые расширяли Sinatra :: Base, как Синатра понимала бы, что get относится к Something, а не к другому классу.

ответ

10

В отличие от способа, например, функций 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 и выполняет то, что там находит.

Смежные вопросы