У меня такой код:

@ids = []
x = 'a'
@ids << x == 'a' ? [1,2] : [3,4]
@ids

Я ожидаю, что в следующей строке значение @ids должно быть @ids = [1,2], но я получаю @ids = ['a']

Зачем ?

3
Hernan Acosta 14 Апр 2020 в 23:13

1 ответ

Лучший ответ

Операции выполняются в порядке их приоритета. Операции в соответствующей строке кода выполняются в таком порядке:

  1. <<
  2. ==
  3. ?,:

См. Полный список на странице Приоритет операций Ruby.

Здесь круглые скобки указывают, что на самом деле происходит в вашем примере:

(((@ids << x) == 'a') ? [1,2] : [3,4])
^^^----1----^       ^                ^
||---------2--------|                |
|------------------3-----------------|

Чтобы получить ожидаемый результат, напишите

@ids << (x == 'a' ? [1,2] : [3,4])

Или

@ids.push(x == 'a' ? [1,2] : [3,4])

Я надеюсь, вы найдете это полезным.

6
knugie 14 Апр 2020 в 20:48