Как изменить значение локальной переменной с помощью метода? - PullRequest
0 голосов
/ 14 сентября 2018

Я написал некоторый код:

a = 4
b = 7
def swaps(g, f)
  g ^= f; f ^= g; g ^= f
end

swaps(a, b)
p a, b

Я думал, что хочу получить результат: значение равно 7, значение b равно 4, но я получил результат:

4, 7

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Лучше я читаю комментарии раньше! Кредиты Джордан Бег и Йохан Вентхольт

Я оставляю этот пост только для того, чтобы указать на эти решения.


Может быть, параллельное присваивание может сделать это, вместо определения метода:

a = 4
b = 7

a, b = b, a

p a #=> 7
p b #=> 4

Или, если это звучит яснее:

def swap(a, b)
  return b, a
end

a, b = swap(a, b)
0 голосов
/ 14 сентября 2018

У вас нет доступа к этим локальным переменным внутри вашего метода.

Вы можете поиграть с ним, передав binding, но это не должно использоваться в реальной жизни:

Объекты класса Binding инкапсулируют контекст выполнения в каком-то конкретном месте в коде и сохраняют этот контекст для будущего использования.

def change(local_variable_name, binding, new_value)
  binding.local_variable_set(local_variable_name, v)
end

Тест:

a = 1

a                      #=> 1
change(:a, binding, 2) #=> 2
a                      #=> 2

Ваш случай:

def swap(first, second, binding)
  old_first  = binding.local_variable_get(first)
  old_second = binding.local_variable_get(second)

  binding.local_variable_set(first, old_second)
  binding.local_variable_set(second, old_first)
end

a = 1
b = 2
swap(:a, :b, binding)
a #=> 2
b #=> 1

Ссылка:

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