Ruby中是否有string#blank?方法?

12

String#blank?非常有用,但只存在于Rails框架中,而非Ruby本身。

那么在Ruby中是否有类似的函数来替代它呢?

str.nil? || str.empty?

我在http://ruby-doc.org/core-2.0/String.html的参考文献中没有看到类似的内容。 - shishirmk
请参考此答案获取相关信息:https://dev59.com/nVPTa4cB1Zd3GeqPmclA - squiguy
1
可能是重复问题:https://dev59.com/UnVC5IYBdhLWcg3wliKe - christianblais
如果 Ruby 中已经有这样的东西,那么 Rails 就不会推出它了。 - sawa
String#blank?与测试nil?empty?不等效,因为它对于仅包含空格的字符串返回true - Marc-André Lafortune
6个回答

17

据我所知,纯 Ruby 中没有这样的东西。你可以像这样创建自己的:

class NilClass
  def blank?
    true
  end
end

class String
  def blank?
    self.strip.empty?
  end
end

对于nil.blank?a_string.blank?,这将起作用,您可以像rails一样扩展真/假和通用对象:

class FalseClass
  def blank?
    true
  end
end

class TrueClass
  def blank?
    false
  end
end

class Object
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
end

参考文献:

https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L57 https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L67 https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L14 https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L47

这里是 String.blank? 的实现,比以前的更加高效:

https://github.com/rails/rails/blob/2a371368c91789a4d689d6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L101


那个实现可能更加低效。试试在“一个非常非常长的字符串......”上玩玩! - Marc-André Lafortune
将NilClass扩展是否是一种不良实践? - B Seven
@BSeven 是的,而且这种解决方案在处理Rails方法可处理的多种对象时是无效的。此外,正如Marc-Andre指出的那样,strip 有点低效(特别是当你扔掉输出时)。 - Mark Thomas
@MarkThomas 你所说的“各种对象”是什么意思?我回答中的最后一个链接就是你在回答中复制的内容。 - aromero
2
感谢您的更新。现在这个答案更好了。有一个小问题:您不需要为TrueClassFalseClass分别创建补丁,因为!self部分会自动处理它们。 - Mark Thomas

4

您可以始终像Rails一样操作。如果您查看blank的源代码,您会发现它将以下方法添加到Object中:

# File activesupport/lib/active_support/core_ext/object/blank.rb, line 14
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end

2
值得一提的是,在新版本中,代码已经调整为 respond_to?(:empty?) ? !!empty? : !self - Brad Werth
@someuser,你说得对。在Rails中,上述内容应用于“Object”,以便能够处理任何“blank?”。但是,这取决于已定义的“String#blank?”,它考虑到了带有空格的字符串。你可以使用self !~ /\S/来实现。不确定为什么我在这篇五年前的文章中没有注意到这一点。猜想我现在更年长更明智了 :) - Mark Thomas

3
你觉得这样行吗:

str.to_s.empty?

它是关于IT技术的。

5
str.to_s.strip.empty?的意思是检查字符串是否为空或只包含空格字符。 - numbers1311407

2
在 Ruby 中不存在这样的函数,但是有一个关于 String#blank? 的提案正在 ruby-core 上进行讨论。
与此同时,您可以使用以下实现:
class String
  def blank?
    !include?(/[^[:space:]]/)
  end
end

这种实现方式非常高效,即使对于非常长的字符串也是如此。

2
假设您的字符串可以被剥离,那么以下代码有什么问题:str.nil? or str.strip.empty?
2.0.0p0 :004 > ' '.nil? or ' '.strip.empty? 
 => true 

1
这还不够,例如,nil.blank?应该返回true。 - aromero
2
因为我不知道strip的存在。 - hd1
我已经考虑了您的评论并改进了答案。 - hd1
1
在这种情况下使用 strip 可能非常低效。 - Marc-André Lafortune

1

如果有新手需要这个,可以使用simple_ext gem。这个gem可以帮助你在Rails中使用所有Ruby核心对象的扩展,如Array、String、Hash等。

require 'simple_ext'
str.blank?
arr.blank?
... etc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接