Это потому, что методы Ruby не являются объектами первого класса (например, они были бы в IO). Итак, когда вы определяете внутренний метод, что такое приемник? Предположительно, сам метод или привязка или что-то еще, но Ruby не имеет такой глубины OO.
В любом случае, мне непонятно, что вы ожидали в вашем примере, хотите ли вы изменить локальный varialbe a
? Если это так, proc является подходящей заменой метода.
def test
a = "a is for apple"
inner_method = lambda do
a = "something"
end
a # => "a is for apple"
inner_method.call
a # => "something"
end
test
«functional.rb» является более экстравагантным примером такого стиля программирования.
И «lambda, proc, and Proc.new» - это разбивка различных типов замыканий на Ruby.
Это просто кажется неуместным, когда все остальное имеет лексический охват. –
"Все остальное"? За исключением блоков, * nothing * имеет лексический охват. Не тела методов. Не классные тела. Не модульные тела. Не скриптовые тела. * Блоки * - это те, которые «неуместны». –
Методы Scala не являются первоклассными объектами, но внутренние методы близки к окружающим их средам. Существует гораздо более простая причина, по которой «внутренний метод» не закрывает свой внешний метод: поскольку он * не является «внутренним методом». Это определение глобального метода. –