2012-02-01 3 views
7

НапримерПочему рубиновые методы не имеют лексической сферы?

def test 
    a = "a is for apple" 
    def inner_method 
     a = "something" # this will refer to a different "a" 
    end 

    inner_method 
    puts a 
end 

Существуют ли какие-либо причины для этого? Блоки имеют лексический охват, так почему же не методы? Это будет исправлено?

ответ

11

Это потому, что методы 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.

+0

Это просто кажется неуместным, когда все остальное имеет лексический охват. –

+5

"Все остальное"? За исключением блоков, * nothing * имеет лексический охват. Не тела методов. Не классные тела. Не модульные тела. Не скриптовые тела. * Блоки * - это те, которые «неуместны». –

+3

Методы Scala не являются первоклассными объектами, но внутренние методы близки к окружающим их средам. Существует гораздо более простая причина, по которой «внутренний метод» не закрывает свой внешний метод: поскольку он * не является «внутренним методом». Это определение глобального метода. –

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