【发布时间】:2020-02-11 08:04:07
【问题描述】:
我想这样做:
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 中是否存在“安全铲”或简单的“铲或分配”习语,尤其是对于可能为 nil 的字符串?
【问题讨论】:
-
但如果
summary = nil和你summary &.<< 'foo',你仍然留下summary.nil?为真。您被卡住了,因为您必须更改summary所指的内容,而唯一明智的做法是使用分配。那么为什么summary可以是nil呢?为什么不能初始化为空字符串? -
不只是
(summary ||= '') << 'foo'? @muistooshort,我可以想象像['dog', 'cat'].find { |s| s == 'pig' } << "hello" -
@CarySwoveland 我想你可以,但我更喜欢清晰而不是聪明。也许是在 Ruby 领域的一种奇怪态度。我倾向于初始化
summary或 OP 的Array#join解决方案。 -
@DavidHempy 您可以从一个空字符串开始,做任何需要做的事情,然后将空字符串映射回
nil,然后再将它们发送到数据库。我经常在 Rails 中使用self.whatever = whatever.to_s.mangle.presence来隐藏一堆nil检查,#to_s将nil转换为'',同时保留字符串,#presence调用将''转换为nil同时留下字符串。类似的事情适用于nils,它可以是数组或散列,因为NilClass#to_a和NilClass#to_h做正确的事情。 -
我喜欢最后一个想法,@muistooshort。我不知道
''.presence将空字符串转换为 nil。我肯定会放弃这个想法。