Причина: приоритет оператора . Когда нет скобок для указания Ruby, тогда Ruby сначала оценивает оператор с более высоким приоритетом.
Просматривая таблицу Ruby приоритета оператора , вы можете видеть, что <<
имеет более высокий приоритет, чем ==
и оператор ? :
.
Это означает, что Ruby будет интерпретировать
result_from_ternary << letter == '.' ? '[.]' : letter
в таком порядке
((result_from_ternary << letter) == '.') ? '[.]' : letter
Это, очевидно, не то, что вы хотите, поэтому вам нужно "переопределить" порядок приоритета по умолчанию с добавлением скобок:
result_from_ternary << (letter == '.' ? '[.]' : letter)