L oop сбрасывает переменную - PullRequest
1 голос
/ 21 февраля 2020

Я сталкиваюсь со следующим неожиданным поведением при выполнении следующего l oop:

outside_var = 'myString'
loop do
  inside_var ||= outside_var
  result = SomeCalculation.do_something(inside_var)
  inside_var = result[:new_inside_var_value]
end

Теперь на первой итерации inside_var устанавливается в outside_var, что является ожидаемым поведением. Непосредственно перед следующей итерацией я установил inside_var на что-то другое (в зависимости от результата, полученного в результате вычисления внутри l oop). Это назначение работает (печать inside_var в самом низу l oop подтверждает это). На следующей итерации, однако, inside var возвращается в исходное состояние, чего я не ожидал. Почему это происходит, и как я могу установить эту переменную внутри этого l oop?

Я использую Ruby 2.6.5 с Rails 6.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Это проблема с областью видимости. inside_var относится к блоку. Можно проверить привязку, она меняется.

outside_var = 'myString'
2.times do
  puts "INSIDE 1: #{defined?(inside_var).nil?} → #{binding}"
  inside_var ||= outside_var
  puts "INSIDE 2: #{inside_var}"
end
#⇒ INSIDE 1: true → #<Binding:0x000055a3936ee0b0>
#  INSIDE 2: myString
#  INSIDE 1: true → #<Binding:0x000055a3936edc50>
#  INSIDE 2: myString

Тем не менее, каждый раз, когда выполнение входит в блок, привязка сбрасывается, поэтому не следует ожидать переменных из другой области (с другой привязкой) существовать.

0 голосов
/ 21 февраля 2020

Когда вы делаете новую итерацию внутри l oop, вы собираетесь сбросить все. Я предлагаю вам изменить переменную вне l oop, чтобы сохранить значение внутри. Как то так:

result_var = 'myString' # value on the first iteration
loop do
  result = SomeCalculation.do_something(result_var)
  result_var = result[:new_inside_var_value] # at the end of the first iteration you are already overriding this value
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...