连接字符串(如果不为空)

时间:2019-02-07 02:51:45

标签: ruby

仅在非空白或error_details的情况下才可以一行打印nil吗?

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

我想我可以将error_details = ''设置在顶部。我想知道是否可以避免执行该行代码。

5 个答案:

答案 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 -    '

/ - $/

我们要做的就是找到-模式,并确保它位于字符串的末尾。这将删除nilempty? error_details以及分隔符。任何error_details(甚至' ')也不会被删除。我留了空白字符串,因为它是一条有趣的消息,应该对其进行调查,而不是将其自动丢弃。

String#partition有趣且功能强大,可确保将字符串分为3部分。