Правильно ли назначать несколько переменных, таких как a = b = c = d = 5? - PullRequest
54 голосов
/ 28 мая 2010
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

Ответы [ 6 ]

102 голосов
/ 28 мая 2010

Следует помнить, что ваше дело работает только в порядке, поскольку числа в 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"
8 голосов
/ 28 мая 2010

Нет ничего плохого в том, чтобы назначить его таким образом (a = b = c = d = 5). Лично я предпочитаю это множественному присваиванию, если все переменные должны иметь одинаковое значение.

Вот еще один способ:

a, b, c, d = [5] * 4
7 голосов
/ 28 мая 2010

Если вам нравится, сделайте это.

Язык позволяет это, как вы обнаружили, и ведет себя так, как вы ожидаете. Я бы сказал, что единственный вопрос, который вы должны задать себе, касается выразительности: код говорит вам, какова его цель?

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

4 голосов
/ 28 мая 2010

Эти две инициализации выражают различное значение. a = b = c = d = 5 означает «все мои переменные должны быть инициализированы одним и тем же значением, и это значение равно 5». Другой, a, b, c, d = 5, 5, 5, 5, означает «У меня есть список переменных и соответствующий список значений инициализации».

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

a = 5
b = 5
c = 5
d = 5
3 голосов
/ 25 августа 2012

Однажды меня укусили этим. Это может спасти вас от нескольких нажатий клавиш сегодня, но прикусит вас позже. Как уже упоминалось, @glenn создает несколько ссылок на один и тот же объект.

Пример: это относится как к рубину 1.8, так и к 1.9

> a = b = Array.new
=> []
> a.object_id == b.object_id
=> true
> a << 1
=> [1]
> b << 2
=> [1, 2]
0 голосов
/ 28 мая 2010

Я вообще не использую ruby, так что это может быть приемлемой идиомой, но a = b = c = d = 5 выглядит довольно уродливо для меня. a , b, c, d = 5, 5, 5, 5 выглядит намного лучше, ИМО.

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