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

时间:2009-03-15 05:59:52

标签: ruby boolean string

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

if word.infinitive == ""
      return word
else return word.infinitive

如果不定式返回nil而不是“”,我本可以做类似

的事情
(word.infinitive or word)

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

6 个答案:

答案 0 :(得分:123)

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

word.infinitive.presence || word

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

require 'active_support/core_ext/object/blank'

答案 1 :(得分:8)

您可以使用this article suggests

等正则表达式
(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil

答案 2 :(得分:6)

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

答案 3 :(得分:5)

如果您对monkeypatching和滥用语法不感到羞耻,这将有效:

class String
  def | x
    if empty? then x else self end
  end
end

然后你可以说word.infinitive | word,如果你问我,它实际上会很自然地扫描。

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

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

[word.infinitive, word].find {|x| not x.empty?}

答案 4 :(得分:4)

您可以将三元运算符(boolean ? true-val : false-val)String#empty?

一起使用
return word.infinitive.empty? ? word : word.infinitive

如果你只想打一次不定式:

return (inf = word.infinitive).empty? ? word : inf

您可能还需要考虑在代码中添加一些memoization

答案 5 :(得分:4)

或者您可以将新函数monkeypatch到String而不必滥用语法。

class String
  def squash
    self.empty? ? nil : self
  end
end

现在你可以做到

puts var.squash or "default text"

我不是母语为英语的人,所以我不知道壁球是否是最好的词。是否有一个词可以更好地传达“只有空洞才变成零”的想法?