Как вы читаете это троичное условие в Ruby? - PullRequest
6 голосов
/ 15 марта 2012

Я наткнулся на троицу в каком-то коде, и у меня возникают проблемы с пониманием условного:

str.split(/',\s*'/).map do |match|
  match[0] == ?, ?
    match : "some string"
end.join

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

1 Ответ

7 голосов
/ 15 марта 2012

(немного) менее запутанный способ написать это:

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".

...