(немного) менее запутанный способ написать это:
str.split(/',\s*'/).map do |match|
if match[0] == ?,
match
else
"some string"
end
end.join
Я думаю, что многострочные троичные операторы ужасны, тем более что блоки if
могут возвращаться в Ruby.
Вероятно, самая запутанная вещь здесь - это ?,
, который является символьным литералом. В Ruby 1.8 это означает значение ASCII символа (в данном случае 44
), в Ruby 1.9 это просто строка (в данном случае ","
).
Причина использования символьного литерала вместо ","
заключается в том, что возвращаемое значение вызова []
для строки изменилось в Ruby 1.9. В 1.8 он возвращает значение ASCII символа в этой позиции , в 1.9 возвращает строку из одного символа . Использование ?,
здесь позволяет не беспокоиться о различиях в String#[]
между Ruby 1.8 и 1.9.
В конечном счете, условное условие просто проверяет, является ли первый символ в match
,
, и если это так, оно сохраняет значение тем же, иначе оно устанавливает его на "some string"
.