Это более сфокусированная версия моего предыдущего вопроса о том, как Синатра обрабатывал методы маршрутов.
Из моего понимания исходного кода Синатра берет блок метода в маршруте и передает новый метод, содержащий то же самое тело, т.е.:
get "some/url" do
return "Hello World" # this gets taken out
end
Таким образом, в этом примере тело метода, похоже, копируется в новый метод, который применяется к объекту Sinatra. Мне просто интересно, почему это происходит, я пытался зайти на их канал IRC, но там никого не было, и список рассылки не так занят.
Основная масса исходного кода, о котором я говорю в их среде, находится внутри base.rb в строке 1180:
def generate_method(method_name, &block)
define_method(method_name, &block)
method = instance_method method_name
remove_method method_name
method
end
Так есть ли какая-то конкретная причина, почему они делают это, а не просто ссылаются на сам метод?
Причина, по которой я задаю этот вопрос, заключается в том, что метод, который Синатра в настоящее время обрабатывает, делает невозможным использование метода, обладающего знаниями вне себя, и нарушает инкапсуляцию классов, просто принимая один метод без контекста.