【问题标题】:Checking for nil string before concatenating在连接之前检查 nil 字符串
【发布时间】:2011-01-12 19:40:18
【问题描述】:

这个问题与很多问题相似,但绝不是重复的问题。这个问题是关于字符串连接和编写比检查零/零更好的代码。

目前我有:

file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1)

效果很好,但看起来不太好。用 ruby​​ 编写这个更好的方法是什么,以便我检查 nil 而不是连接它

【问题讨论】:

    标签: ruby code-formatting


    【解决方案1】:

    你可以这样做:

    file.puts "cn: " + (var1 || "UNKNOWN")
    

    或者,如果您愿意,也一样:

    file.puts "cn: " + (var1 or "UNKNOWN")
    

    或我最喜欢的,我认为是最惯用的红宝石:

    file.puts "cn: #{var1 or 'unknown'}"
    

    【讨论】:

    • 如果 var1 是 false,您会看到“未知”。
    【解决方案2】:

    使用join 添加可能是nil 的字符串。

    如果有niljoin 不会抱怨

    例如:

    ["a","b",nil,"c"].join("") 
    #=> abc
    

    但是,如果您使用除空白字符串(例如下划线)之外的任何字符串进行连接,您将获得 nil 值的连接字符串:

    ["a","b",nil,"c"].join("_")
    #=> a_b__c
    

    要解决此问题,请在加入前使用.compactArray 中删除nil 值:

    ["a","b",nil,"c"].compact.join("_")
    #=> a_b_c
    

    【讨论】:

    • 只有在通过空 ["a","b",nil,"c"].join("_") => "a_b__c" 连接时才有效(注意后面的双下划线'b')
    • @pseudo ["a","b",nil,"c"].compact.join("_") 解决问题
    • @Viktor 谢谢。更新了答案以反映这一点。
    【解决方案3】:

    使用 ruby​​ 2.4.1,to_s 解析 nil"Hello"。所以var1.to_s 就足够了。

    2.4.1 :058 > nil.to_s
     => "" 
    2.4.1 :059 > "hello".to_s
     => "hello" 
    

    【讨论】:

      【解决方案4】:

      假设false 不是var1 的有效值,并且var1 保证为nil 或字符串,我会按照Peter 的建议进行操作。您还可以将该逻辑提取到一个函数中:

      def display_value(var)
        (var || "UNKNOWN").to_s # or (var.nil? ? "UNKNOWN" : var.to_s) if 'false' is a valid value
      end
      
      file.puts "cn: " + display_value(var1)
      

      to_s 仅在 var1 不能保证为 nil 或字符串时才需要。或者,如果你这样做:

      file.puts "cn: #{display_value(var1)}"
      

      它将对display_value的结果执行隐式to_s

      【讨论】:

        【解决方案5】:
        file.puts( "cn:" + (var1 || "UNKNOWN" ))
        

        【讨论】:

          【解决方案6】:

          由于"cn: " 部分纯粹是为了美观,因此(更多?)可能会根据未来的演示指南进行更改,我建议使用join;

          file.puts(["cn", (var1 || "UNKNOWN")].join(": ")
          

          也许作为一个函数,如前所述——语义相同,只是方法名称/关键字发生了变化;

          def value_or_unknown(value, attribute = nil)
            [attribute, (value or "UNKNOWN")] * ": "
          end
          

          【讨论】:

            猜你喜欢
            • 2019-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-05
            • 1970-01-01
            • 2021-04-26
            相关资源
            最近更新 更多