Инициализируйте две переменные в одной строке - PullRequest
24 голосов
/ 14 мая 2011

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

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

foo = 0
bar = 0

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

foo = bar = 0

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

Ответы [ 5 ]

35 голосов
/ 14 мая 2011

Это работает, но вы должны знать, что это безопасно только для вашей ситуации, потому что вы используете переменные для чисел, которые неизменны в 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"
30 голосов
/ 14 мая 2011

Хорошей практикой является инициализация двух переменных в одной строке, если назначаемое значение является коротким и простым для отслеживания. Вы даже можете назначить два разных значения, используя синтаксис массива.

foo = bar = 123
foo #=> 123
bar #=> 123

foo, bar = 1, 2
foo #=> 1
bar #=> 2
18 голосов
/ 14 мая 2011

Во многих языках последний назначает один и тот же объект обеим переменным, что может быть проблемой, если объект изменчив. Лучше сделать это:

foo, bar = 0, 0
8 голосов
/ 26 декабря 2013

Это странно.

Ответ Игнасио Васкеса-Абрамса верен для инициализации переменной с различными значениями с:
a, b = 123, 456

Но я думаю, что вы беспокоитесь о том, чтобы сделать следующее:
a = b = "hello"

Но ПОДОЖДИТЕ! Приведенная выше строка выделяет один и тот же адрес памяти для переменных a и b, т.е.
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

О, если бы был элегантный способ сделать это.

1 голос
/ 14 мая 2011

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

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

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

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