Задать вопрос
@nevro
не пойми кто

Если блок — это замыкание, то почему нельзя из него получить доступ к локальной переменной?

В таком варианте я не могу получить доступ к переменной name из обрамляющей функции:
def closure
    name = "локальная"
    puts "перед блоком"
    yield(name)  # name = yield(name)
    puts "после блока"
    puts name
end

closure do |word|
    puts "Внутри блока."
    word = word + " добавка от блока"
    puts word
    puts "Выход из блока."
    #   word
end


Вывод:
перед блоком
Внутри блока.
локальная добавка от блока
Выход из блока.
после блока
локальная


В name обрамляющей функции останется "локальная добавка от блока" только, если некоторые строки заменить комментариями, а их - закомментировать. Но почему так? Значит блоки - не полноценные замыкания?
  • Вопрос задан
  • 161 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Dem1
@Dem1
Ruby on Rails developer
Это от не знания, что метод + создает новый объект.
Вот так будет, как вы хотите

closure do |word|
    puts "Внутри блока."
    word.concat " добавка от блока"
    puts word
    puts "Выход из блока."
    #   word
end
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы