1

在字符串
"#{x ? (x.to_s + ' is ') : ''}ok"中,Rubocop 的 Style/StringConcatenation 建议避免使用+.
但这需要一个嵌套的字符串插值
"#{x ? '#{x.to_s} is ' : ''}ok)"
至少在 Ruby 2.7 中它没有被扩展: #{x.to_s}被视为任何其他文字。

版本是否可以,+因为它处于样式指南可以涵盖的边缘,还是必须引入一个临时变量?

tmp = x ? '#{x.to_s}  is '  : ''
"#{tmp}ok"

上下文:字符串被发送到日志文件。 ok实际上是一长串细节。 x值得记录,但仅当它存在时。

4

2 回答 2

3

是的,一个变量将使这个更具可读性(imo):

prefix = "#{x} is " if x
"#{prefix}ok"

(这取决于以下事实nil#to_s == ''

于 2021-01-22T17:58:48.027 回答
1

鉴于“好的”实际上是:(根据评论

"...一个有更多插值的长字符串。复制该字符串不是 DRY"

我会去

ok = generate_some_long_string()
ok.prepend("#{x} is ") if x
ok

这确实发生ok了变化,但根据我对这个问题的理解,这实际上可能是可取的。

嵌套插值

顺便说一句,我不推荐它(因为它很难阅读)但是嵌套插值是完全有效的红宝石,例如

x="val"
"#{x ? "#{x} is " : ""}ok"
#=> "val is ok"

这是有效的,因为插值闭包内的内容被视为任何其他 ruby​​ 代码。内部双引号打开和关闭一个新的字符串,而不是关闭第一个并打开另一个,因为插值闭包正在等待一个右花括号。从技术上讲,您可以在任何深度执行此操作。

"#{x ? "#{"the #{y = x}ue of"} #{x} is " : ""}#{y.inspect}"
#=> "the value of val is \"val\""
于 2021-01-22T19:42:02.597 回答