Правильно ли назначать такие переменные как a = b = c = d = 5?
a = b = c = d = 5
puts (a) >> 5
puts (b) >> 5
puts (b) >> 5
puts (b) >> 5
a= a+1
puts (a) >> 6
puts (b) >> 5
Я обнаружил, что нет никаких проблем с назначением таких значений. Мой вопрос заключается в том, чтобы назначить, как указано выше, или как это?
a , b, c, d = 5, 5, 5, 5
Ответы
Ответ 1
Что нужно знать о том, что ваш случай работает только нормально, потому что номера неизменяемы в Ruby. Вы не хотите делать это со строками, массивами, хэшами или почти что-либо кроме чисел, потому что оно создало бы несколько ссылок на один и тот же объект, что почти наверняка не то, что вы хотите:
a = b = c = d = "test"
b << "x"
=> "testx"
a
=> "testx"
В то время как параллельная форма безопасна для всех типов:
a,b,c,d = "test","test","test","test"
=> ["test", "test", "test", "test"]
b << "x"
=> "testx"
a
=> "test"
Ответ 2
Нет ничего плохого в назначении этого пути (a = b = c = d = 5
). Я лично предпочитаю его по нескольким присваиваниям, если все переменные должны иметь одинаковое значение.
Здесь другой способ:
a, b, c, d = [5] * 4
Ответ 3
Если он чувствует себя хорошо, сделайте это.
Язык позволяет это, как вы обнаружили, и ведет себя так, как вы ожидали. Я бы предположил, что единственный вопрос, который вы должны задать себе, касается выразительности: это код, рассказывающий вам, какова его цель?
Лично мне не особенно нравится использовать эту конструкцию для многих других целей, кроме инициализации, по умолчанию, предпочтительно нуля. В идеале переменные, которые были бы инициализированы, имели бы аналогичную цель, например, счетчики. Но если бы у меня было больше пары одинаково назначенных переменных, я вполне мог бы рассмотреть вопрос о том, чтобы объявить их формой дублирования, чтобы быть реорганизованными, например, в Hash.
Ответ 4
Эти две инициализации выражают другое значение. Значение a = b = c = d = 5
означает, что все мои переменные должны быть инициализированы с одинаковым значением, а это значение равно 5 ". Другой, a, b, c, d = 5, 5, 5, 5
, означает" У меня есть список переменных и соответствующий список значений init".
Является ли ваша логика такой, что все переменные всегда должны быть одинаковыми? Тогда первое лучше. Если нет, второй может быть лучше. Другой вопрос: полный список из 4 переменных? Вероятно, вы добавите или удалите другую переменную в эту группу? Если это так, я бы предложил еще один вариант:
a = 5
b = 5
c = 5
d = 5
Ответ 5
Я однажды укусил этот. Сегодня это может спасти вас несколькими нажатиями клавиш, но потом укусить вас. Как упоминал @glenn, он создает несколько ссылок на один и тот же объект.
Пример. Это относится как к ruby 1.8
, так и к 1.9
> a = b = Array.new
=> []
> a.object_id == b.object_id
=> true
> a << 1
=> [1]
> b << 2
=> [1, 2]
Ответ 6
Я вообще не использую ruby, так что это может быть приемлемая идиома, но a = b = c = d = 5
выглядит довольно уродливо для меня. a , b, c, d = 5, 5, 5, 5
выглядит намного приятнее, ИМО.