24

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

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

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

(word.infinitive or word)

但是因为它没有,所以我不能利用短路或
理想情况下我想要
1)我可以轻松嵌入其他代码中的单个表达式
2)函数不定式仅被调用一次
3)不添加任何在我的代码中自定义宝石或插件

4

6 回答 6

126

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

word.infinitive.presence || word

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

require 'active_support/core_ext/object/blank'
于 2011-03-24T22:47:42.047 回答
11

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

(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil
于 2010-06-07T14:40:55.480 回答
7

如果您不为猴子补丁和滥用语法感到羞耻,这将起作用:

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

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

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

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

[word.infinitive, word].find {|x| not x.empty?}
于 2009-03-15T06:28:24.423 回答
6

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

于 2009-03-15T09:10:32.550 回答
5

或者,您可以在不必滥用语法的情况下将新函数修补到 String。

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

现在你可以做

puts var.squash or "default text"

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

于 2010-05-25T21:27:41.063 回答
4

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

return word.infinitive.empty? ? word : word.infinitive

如果您只想调用一次不定式:

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

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

于 2009-03-15T06:23:23.217 回答