【问题标题】:Ruby: blank? without Rails鲁比:空白?没有 Rails
【发布时间】:2013-07-01 04:10:03
【问题描述】:

我想做这个测试:

if (line.blank?) do_stuff

...但我使用的是纯红宝石,而不是铁轨。实现相同效果的公认习语是什么?

我正在为一个字符串执行此操作,在哪里测试 .empty?与测试.blank 不同吗? (一个全空格的字符串不是空的,而是空白的。)

【问题讨论】:

  • 谢谢,凯尔。在 String 那里找到它。您介意在下面添加此答案,以便我接受吗? (不幸的是,到目前为止提供的两个答案都不正确,在字符串的上下文中,所有空格的行仍然测试为非空。)rails 定义只是:def blank? self !~ /[^[:space:]]/ end

标签: ruby


【解决方案1】:

这是可能的:

line.to_s.strip.empty?

【讨论】:

    【解决方案2】:

    blank? 不仅在 String 中定义,它也是 Nil 的一部分,因为它是一个双重测试。它检查变量是nil? 还是empty?/空白。

    您不能询问字符串是否为 nil,因为它没有 nil? 方法,但您可以询问 Nil 是否为 nil?

    Active Support 具有可用的核心扩展,让我们能够挑选所需的功能并包含必要的方法。对于blank?,您可以这样做:

    require 'active_support/core_ext/object/blank'
    

    请参阅blank? 了解更多信息,并阅读整个文档以了解还有什么可用的。以这种方式使用 Active Support 无需加载所有 AS 并获得有用的功能。

    【讨论】:

      【解决方案3】:

      来自ActiveSupport

      line !~ /[^[:space:]]/
      

      【讨论】:

      • /[^[:space:]]//\S/ 不同吗?我想知道为什么 Rails 采用前一种方式。
      • @sawa docs 提到它,包括[:blank:],它是对制表符的检查。它还包含对换行符和回车符的检查。也许这就是原因。
      • /\s/ 也一样。
      • @sawa /\s/ 严格等同于/[ \t\r\n\f]/,而POSIX bracket expression /[[:space:]]/ 匹配任何Unicode whitespace character
      【解决方案4】:

      添加到@sawa 的答案

      pry(main)> Benchmark.ips do |x|
      pry(main)*   x.report("strip") { "  ".strip.empty? }
      pry(main)*   x.report("regex") { "  " !~ /\S/ }
      pry(main)*   x.compare!
      pry(main)* end
      Warming up --------------------------------------
                     strip   199.937k i/100ms
                     regex   120.402k i/100ms
      Calculating -------------------------------------
                     strip      4.205M (± 3.6%) i/s -     21.193M in   5.047231s
                     regex      2.019M (± 3.7%) i/s -     10.114M in   5.017202s
      
      Comparison:
                     strip:  4204798.7 i/s
                     regex:  2018957.6 i/s - 2.08x  slower
      

      所以if line.to_s.strip.empty? 是要走的路

      【讨论】:

        【解决方案5】:

        blank? 基本上只是检查empty? || nil?。因此,您可以自己制作空白方法,也可以在条件句中同时检查它们。

        【讨论】:

        • docblank? 为空白字符串返回true,而empty? || nil? 不是这种情况。
        【解决方案6】:
        if line.empty? || line.nil?
        

        您可以将它包装在 line 类中的 blank? 方法中

        【讨论】:

        • 这不适用于空白字符串。请参阅我上面的评论。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 2011-09-07
        相关资源
        最近更新 更多