Инициализировать две переменные на одной строке
У меня возникли проблемы с поиском авторитетного примера или обсуждения этой концепции. Если у меня есть два переменных в моем методе Ruby, которые являются числами, и мне нужно инициализировать их до нуля. Они будут использоваться в качестве счетчиков. Это нормально или безопасно? Он работает в моих тестах.
Вместо этого:
foo = 0
bar = 0
Вы можете сделать это?
foo = bar = 0
Кажется, это хороший способ сэкономить на линиях и по-прежнему быть выразительным. Или это плохая практика? Я понимаю, что немного пожертвовал бы удобочитаемостью. Но в небольшом методе Ruby (< 10 строк) это может быть недействительным.
Ответы
Ответ 1
Это работает, но вы должны знать, что он безопасен только для вашей ситуации, потому что вы используете переменные для чисел, которые неизменны в Ruby. Например, если вы попробовали одно и то же со строкой, вы могли бы получить некоторое поведение, которого вы не ожидали:
ruby-1.9.2-p180 :001 > foo = bar = "string"
=> "string"
ruby-1.9.2-p180 :002 > foo.upcase!
=> "STRING"
ruby-1.9.2-p180 :003 > bar
=> "STRING"
Ответ 2
Прекрасно практиковать инициализацию двух переменных на одной и той же строке, при условии, что значение присваивается как краткое и простое. Вы даже можете назначить два разных значения, используя синтаксис массива.
foo = bar = 123
foo #=> 123
bar #=> 123
foo, bar = 1, 2
foo #=> 1
bar #=> 2
Ответ 3
Во многих языках последний присваивает один и тот же объект обеим переменным, что может быть проблемой, если объект изменен. Лучше сделать это:
foo, bar = 0, 0
Ответ 4
Это странно.
Ответ Ignacio Vazquez-Abrams верен для инициализации переменной с разными значениями:
a, b = 123, 456
Но, я думаю, ваша забота заключается в том, чтобы сделать следующее:
a = b = "hello"
Но ЖДИТЕ! Вышеупомянутая строка выделяет один и тот же адрес памяти для переменных a
и b
i.e.
a.object_id
и b.object_id
равны. Поэтому любые изменения на a
сохранялись бы на b
.
Мне это не нравится, но обходной путь может быть.
x = "a very long string or something you don't want to type multiple times"
a, b, c = x.clone, x.clone, x.clone
О, я бы хотел, чтобы был элегантный способ сделать это.
Ответ 5
Это безопасно и работает.
Зависит полностью от вашего стандарта кодирования, не нравится ли что-то вроде этого.
Используйте его и оставьте для последующего рефакторинга, когда придет время.