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

标签: ruby string null assign


【解决方案1】:

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

summary = [summary, reason].join

这可能会或可能不会更容易阅读,并且可能性能较差。但它在没有显式交替的情况下处理 nil 汇总问题。

【讨论】:

  • 我实际上更喜欢这个:直截了当,没有任何不必要的句法线噪音或聪明。
【解决方案2】:

你可以用这样的方法解决这个问题;在|| 的帮助下。

summary = (summary || '') + reason

或者在||=&lt;&lt; 的帮助下这样做:

(summary ||= '') << reason

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 2015-10-14
    • 2018-03-31
    • 2012-03-09
    • 2016-10-27
    • 1970-01-01
    • 2020-10-06
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多