在Ruby中将空字符串转换为nil

Adi*_*rji 23 ruby string boolean

我有一个被调用的字符串word和一个调用的函数infinitive,它
word.infinitive会在某些情况下返回另一个字符串而空字符串,否则
我试图为下面的代码片段找到一个优雅的ruby一行表达式

if word.infinitive == ""
      return word
else return word.infinitive
Run Code Online (Sandbox Code Playgroud)

如果不定式返回nil而不是"",我本可以做类似的事情

(word.infinitive or word)
Run Code Online (Sandbox Code Playgroud)

但由于它没有,我不能利用短路或者
理想情况下我想要
1)单个表达式,我可以很容易地嵌入其他代码
2)函数不定式只被调用一次
3)不添加任何自定义宝石或插件到我的代码中

Dav*_*ips 123

ActiveSupport presence方法将空(或blank?)字符串转换为nil.它专为您的确切用例而设计:

word.infinitive.presence || word
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在rails之外轻松使用ActiveSupport:

require 'active_support/core_ext/object/blank'
Run Code Online (Sandbox Code Playgroud)


Jos*_*hua 9

您可以使用本文建议的正则表达式

(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil
Run Code Online (Sandbox Code Playgroud)


小智 6

做正确的事 - 修复不定式,使其返回nils而不是空字符串,或者如果你真的无法触摸它,请用自己的界面包装它.


Jos*_*Lee 5

如果你不羞于monkeypatching和滥用语法,这将工作:

class String
  def | x
    if empty? then x else self end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你可以说word.infinitive | word,如果你问我,它实际上是相当自然地扫描的.

但是,我认为更好的想法是修改不定式方法,或添加一个返回单词不变的版本.

编辑:这是一个可能更优雅的解决方案:

[word.infinitive, word].find {|x| not x.empty?}
Run Code Online (Sandbox Code Playgroud)


pan*_*gel 5

或者,您可以将新函数猴子补丁到字符串,而不必滥用语法。

class String
  def squash
    self.empty? ? nil : self
  end
end
Run Code Online (Sandbox Code Playgroud)

现在你可以做

puts var.squash or "default text"
Run Code Online (Sandbox Code Playgroud)

我的母语不是英语,所以我不知道“squash”是否是最好的词。有没有一个词能更好地表达“只有空时才变成 nil”的想法?