【问题标题】:Converting an empty string into nil in Ruby在 Ruby 中将空字符串转换为 nil
【发布时间】:2010-10-13 10:33:15
【问题描述】:

我有一个名为word 的字符串和一个名为infinitive 的函数,这样
word.infinitive 在某些情况下会返回另一个字符串,否则会返回一个空字符串
我正在尝试为下面的 code-sn-p 找到一个优雅的 ruby​​ 单行表达式

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

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

(word.infinitive or word)

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

【问题讨论】:

  • 注意“或”和||做同样的事情,但是 ||具有更高的优先级
  • 换句话说,它们都短路了,这就是我想说的
  • 投了反对票,因为选择了一个糟糕的答案作为答案。即使给出了很好的答案

标签: ruby boolean string


【解决方案1】:

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

word.infinitive.presence || word

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

require 'active_support/core_ext/object/blank'

【讨论】:

  • @Intrepidd 我也不能,所以我会支持你的评论。
【解决方案2】:

你可以使用像this article suggests这样的正则表达式

(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • 这很聪明,但 OP 听起来他倾向于微创。
    • 这是侵入性的......但考虑到我必须在多个场合做这样的事情,这是一个非常有用的技巧......无法想象这会如何搞砸其他代码地方..谢谢
    • @adi92 如果可以的话,我真的建议重写不定式方法。
    • 它是我的代码正在导入的包的一部分。其他人的代码也使用这些包。所以修改不定式并不是一个真正的选择。
    • ((vv=<something>)!='' || nil) && vv 如果 的值为 '',则将其变为 nil
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      现在你可以做

      puts var.squash or "default text"
      

      我不是以英语为母语的人,所以我不知道 squash 是否是最好的词。有没有一个词更能表达“只有空了才变成nil”的意思?

      【讨论】:

      • 我喜欢它,我想我会用这个:class String def nillify self.empty? ? nil : self end end "".nillify or "foo" => "foo"
      • @DGM 我将它命名为to_nil,虽然它不会更改非空字符串。
      【解决方案6】:

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

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

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

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

      您可能还想考虑在您的代码中添加一些memoization

      【讨论】:

        猜你喜欢
        • 2012-07-15
        • 2013-03-03
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        相关资源
        最近更新 更多