Является ли «связывание» Руби тем же, что и Scope Chain? - PullRequest
2 голосов
/ 03 июля 2010

Ruby's eval() может быть как

def showblock(&block)
  puts eval("i * 3", block)
end

где блок - блок, переданный в функцию.

Вместо блока можно также передать объект привязки. Является ли объект привязки таким же, как то, что называется «цепочкой областей действия», которая часто упоминается при обсуждении закрытия Javascript?

1 Ответ

2 голосов
/ 21 июля 2010

После некоторого исследования я бы сказал, что да, похоже, что это связанные понятия.

Цепочка областей в JS поддерживает список контекстов выполнения (привязок переменных и т. П.) С контекстом текущей исполняемой области на одном конце цепочки и глобальной областью на другом. Создание замыкания, которое ссылается на свободную переменную, требует сохранения этого списка контекстов, пока замыкание достижимо.

Документация объекта Ruby Binding гласит:

Объекты класса Binding encapsulate контекст выполнения в некоторых конкретное место в коде и сохранить этот контекст для будущего использования. Переменные, методы, ценность себя, и, возможно, блок итератора, который могут быть доступны в этом контексте все сохранено. Связующие объекты могут быть созданы с использованием привязки Kernel # и сделано доступным для обратного вызова Ядро # set_trace_func.

Эти обязательные объекты могут быть переданы как второй аргумент ядра # eval метод, создание среды для оценки.

Я не так много знаю о внутренностях того, как реализована привязка, но, похоже, она служит той же цели: сохранению контекста для будущей оценки.

...