Подтвердить что ты не робот

Инициализировать две переменные на одной строке

У меня возникли проблемы с поиском авторитетного примера или обсуждения этой концепции. Если у меня есть два переменных в моем методе Ruby, которые являются числами, и мне нужно инициализировать их до нуля. Они будут использоваться в качестве счетчиков. Это нормально или безопасно? Он работает в моих тестах.

Вместо этого:

foo = 0
bar = 0

Вы можете сделать это?

foo = bar = 0

Кажется, это хороший способ сэкономить на линиях и по-прежнему быть выразительным. Или это плохая практика? Я понимаю, что немного пожертвовал бы удобочитаемостью. Но в небольшом методе Ruby (< 10 строк) это может быть недействительным.

4b9b3361

Ответ 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

Это безопасно и работает.

Зависит полностью от вашего стандарта кодирования, не нравится ли что-то вроде этого.

Используйте его и оставьте для последующего рефакторинга, когда придет время.