仅在非空白或error_details
的情况下才可以一行打印nil
吗?
log_err("#{error_code} - #{error_details}")
我想我可以将error_details = ''
设置在顶部。我想知道是否可以避免执行该行代码。
答案 0 :(得分:2)
几种可能的方式:
error_code = 'xxx'
error_details = ''
[error_code, error_details].join(['', nil].include?(error_details) ? '' : ' - ')
# or
[error_code, error_details].compact.reject(&:empty?).join(' - ')
#=> "xxx"
答案 1 :(得分:2)
最简单(可能最快)的代码可能如下所示:
"#{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"
答案 2 :(得分:1)
不幸的是,Array#join
不会丢弃log_err [error_code, error_details].
map(&:to_s).reject(&:empty?).join(' — ')
,因此需要清理自己的容器:
log_err(
"#{error_code} - #{error_details}".gsub(/\s*-\s*\z/, '')
)
但这可能就足够了:
{{1}}
答案 3 :(得分:-1)
您不需要特别考虑,因为空字符串和nil
在字符串插值中都成为空字符串。
因此,当error_code
为"foo"
,而error_details
为""
或nil
时,则:
"#{error_code} - #{error_details}"
# => "foo - "
在这里,不包含error_details
的内容,只是您想要的。
答案 4 :(得分:-1)
"#{error_code} - #{error_details}".partition(/ - $/).first
'foo - bar' => 'foo - bar'
'foo - ' => 'foo'
'foo - ' => 'foo - '
/ - $/
我们要做的就是找到-
模式,并确保它位于字符串的末尾。这将删除nil
或empty?
error_details
以及分隔符。任何error_details
(甚至' '
)也不会被删除。我留了空白字符串,因为它是一条有趣的消息,应该对其进行调查,而不是将其自动丢弃。
String#partition有趣且功能强大,可确保将字符串分为3部分。