Почему методы ruby ​​не имеют лексической области? - PullRequest
9 голосов
/ 01 февраля 2012

Например

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

Есть ли для этого причины?Блоки имеют лексическую область видимости, так почему нет методов?Это будет исправлено?

1 Ответ

11 голосов
/ 01 февраля 2012

Это потому, что методы Ruby не являются объектами первого класса (как, например, в IO ).Итак, когда вы определяете внутренний метод, что является получателем?Предположительно, сам метод, или связывание, или что-то в этом роде, но у Ruby нет такой глубины ОО.

В любом случае, мне непонятно, что вы ожидали, что произойдет в вашем примере, если вы хотите изменить егоместный вариант a?Если это так, то метод является подходящей заменой для метода.

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

" functions.rb " является более экстравагантным примером этого стиля программирования.

А " lambda, proc и Proc.new " - это разбивка различных типов замыканий в Ruby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...