【问题标题】:better way to do assignment and check result更好的分配和检查结果的方法
【发布时间】:2012-08-29 20:31:33
【问题描述】:

我必须使用 String.scan 函数,如果没有匹配则返回空数组。

我想用扫描函数分配一个变量并检查它是否匹配,但不幸的是我不能这样做,因为它不会在不匹配时返回 nil 或 false。

我想这样做(1 行):

if ip = str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
  ...
  #use ip
end

但是因为它不会在没有匹配的情况下返回 nil,所以我必须这样做:

ip_match = str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
unless ip_match.empty?
  #use ip
end

有没有更优雅的写法——能够同时进行赋值和清空检查,或者其他美化代码的方法?

谢谢

【问题讨论】:

标签: ruby


【解决方案1】:

我最好使用String helper match 做这样的事情

ip_validator = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/

# match return nil if no match

if str.match ip_validator 
  # blah blah blah.....
end

帮助我保持代码干爽干净。 可能这不是最优雅的,如果有的话寻找其他的:)

您的 ip_validator 正则表达式似乎是一周检查一下Rails 3: Validate IP String

【讨论】:

    【解决方案2】:

    优雅与神秘或“简洁”是有区别的。

    在 Perl 中,您经常会看到人们编写的内容相当于:

    if (!(ip = str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)).empty?)
    

    它更简洁、简洁、紧凑,随便你怎么称呼它。由于=(相等)与通常应该是相等测试的情况相比,它还会导致维护问题。如果将代码传递给不了解逻辑的人,他们可能会错误地“纠正”该代码,然后破坏代码。

    在 Ruby 中,由于维护问题,在条件测试中不使用 equate 是惯用的,而是在测试之后使用赋值。代码更清晰。

    就个人而言,我宁愿在这种情况下不使用unlessunless 是否有助于生成更易于理解的代码,这是一个持续的讨论;我更喜欢if (!ip_match.empty?),因为它读起来更像我们通常谈话的内容——我很少在谈话中以unless 开头。您的里程可能会有所不同。

    【讨论】:

      【解决方案3】:

      由于扫描返回一个数组,即使您确定只有一个结果,您也可以这样做。

      str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/).each do |ip|
        #use ip
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        相关资源
        最近更新 更多