Объединить строку, если она не пуста - PullRequest
0 голосов
/ 07 февраля 2019

Возможно ли в одной строке напечатать error_details, только если оно не пустое или nil?

log_err("#{error_code} - #{error_details}")

Я думаю, я мог бы установить error_details = '' вверху.Мне интересно, смогу ли я избежать этой строки кода.

Ответы [ 5 ]

0 голосов
/ 12 февраля 2019
"#{error_code} - #{error_details}".partition(/ - $/).first
'foo - bar' => 'foo - bar'
'foo - '    => 'foo'
'foo -    ' => 'foo -    '

/ - $/

Все, что мы делаем, - это находим шаблон - и следим за тем, чтобы он находился в конце строки.Это удалит nil или empty? error_details вместе с разделителем.Любые error_details (даже ' ') не будут удалены.Я оставил строки с пробелами, потому что это интересное сообщение, которое следует исследовать, а не отбрасывать автоматически.

String # partition интересно и эффективно, поскольку оно обеспечивает разбиение строки на 3шт.

0 голосов
/ 08 февраля 2019

Самый простой (и, возможно, самый быстрый) код может выглядеть так:

"#{error_code}#{' - ' unless error_details.to_s.empty?}#{error_details}"


Тестирование:

error_code = 'test'
error_details = nil
#=> "test"

error_code = 'test'
error_details = ''
#=> "test"

error_code = 'test'
error_details = 'details'
#=> "test - details"
0 голосов
/ 07 февраля 2019

К сожалению, Array#join не отбрасывает nil с, следовательно, необходимо очистить самих пустых контейнеров:

log_err [error_code, error_details].
  map(&:to_s).reject(&:empty?).join(' — ')

Но, вероятно, этого будет достаточно:

log_err(
  "#{error_code} - #{error_details}".gsub(/\s*-\s*\z/, '')
)
0 голосов
/ 07 февраля 2019

Вам не нужно особое внимание, потому что пустая строка и nil оба становятся пустой строкой при интерполяции строки.

Таким образом, когда error_code равно "foo", а error_details равно "" или nil, затем:

"#{error_code} - #{error_details}"
# => "foo - "

Здесь содержимое error_details не включено, как вы и хотели.

0 голосов
/ 07 февраля 2019

Пара возможных способов:

error_code = 'xxx'
error_details = ''

[error_code, error_details].join(['', nil].include?(error_details) ? '' : ' - ')
# or
[error_code, error_details].compact.reject(&:empty?).join(' - ')

#=> "xxx"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...