Руби идиома в лопатку или ноль? (например, лопата или назначение / безопасная лопата) - PullRequest
1 голос
/ 14 октября 2019

Я бы хотел сделать это:

summary << reason

В моем случае summary - это строка, содержащая несколько предложений, а reason - одно из таких предложений.

Это прекрасно работает, если цель уже имеет значение, но иногда summary может быть nil. В этом случае это поднимает:

NoMethodError: undefined method `<<' for nil:NilClass

Итак, я мог бы написать что-то вроде этого:

if summary 
  summary << reason
else 
  summary = reason
end

Это громоздко и безобразно. Я могу скрыть это с помощью нового метода, такого как append(summary, reason), но я надеюсь, что есть рубиновая идиома, которая может обернуть это кратко.

Я оптимистично попробовал несколько вариантов, но безуспешно:

summary += reason
summary &<< reason

В других сценариях я мог бы построить множество причин (вы можете просто переложить в пустой массив),затем, наконец, объедините их в сводку ... но это не жизнеспособно в моем текущем проекте.

Я также не могу заполнить сводку пустой строкой (выравнивание в пустую строку также работает нормально), как и другой кодзависит от того, иногда он равен нулю.

Итак, есть ли в Ruby идиома "безопасная лопата" или простая "лопата или назначить", особенно для строк, которые могут быть равны нулю?

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

Я предпочитаю ответ @ Oto Brglez, но он вдохновил другое решение, которое может быть кому-то полезно:

summary = [summary, reason].join

Это может быть или не быть легче для чтения, и, вероятно, менее производительным. Но он решает проблему с нулевым итогом без явного чередования.

2 голосов
/ 14 октября 2019

Вы можете решить это с помощью чего-то подобного;с помощью ||.

summary = (summary || '') + reason

Или как с помощью ||= и <<:

(summary ||= '') << reason
...