Ruby成语铲成字符串还是nil? (例如铲子或指定/安全铲子)

Ruby idiom to shovel into a string or nil? (e.g. shovel or assign / safe shovel)

我想这样做:

summary << reason

在我的例子中,summary 是一个字符串,包含几个句子,reason 是一个这样的句子。

如果目标已经有一个值,这很好用,但有时 summary 可以是 nil。在那种情况下,这会引发:

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

所以,我可以这样写:

if summary 
  summary << reason
else 
  summary = reason
end

这既麻烦又丑陋。我可以用像 append(summary, reason) 这样的新方法将它隐藏起来,但我希望有一个 ruby 成语可以简洁地总结它。

我乐观地尝试了一些变体,但没有成功:

summary += reason
summary &<< reason

在其他情况下,我可能会构建一个原因数组(你可以将其放入一个空数组中就好),然后最后将它们加入一个摘要中......但这在我当前的项目中是不可行的。

我也不能用空字符串作为摘要的种子(铲入空字符串也可以正常工作),因为其他代码有时依赖于它为 nil。

那么,Ruby 中是否有 "safe shovel" 或简单的 "shovel or assign" 成语,特别是对于可能为 nil 的字符串?

你可以用这样的方法解决这个问题;在 ||.

的帮助下
summary = (summary || '') + reason

或者在 ||=<< 的帮助下这样做:

(summary ||= '') << reason

我更喜欢@Oto Brglez 的回答,但它启发了另一个可能对某人有用的解决方案:

summary = [summary, reason].join

这可能更容易阅读,也可能不会更容易阅读,而且性能可能较低。但它在没有明确交替的情况下处理了 nil 摘要问题。