10

String#blank?非常有用,但存在于 Rails 中,而不是 Ruby。

Ruby中是否有类似的东西来替换:

str.nil? || str.empty?
4

6 回答 6

16

AFAIK 在普通的 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/2a371368c91789a4d689d ​​6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L57 https://github.com/rails/rails/blob/2a371368c91789a4d689d​​6a864eb320b238c/ lib /active_support/core_ext/object/blank.rb#L67 https://github.com/rails/rails/blob/2a371368c91789a4d689d ​​6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L14 https://github.com /rails/rails/blob/2a371368c91789a4d689d​​6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L47

这是String.blank?应该比前一个更有效的实现:

https://github.com/rails/rails/blob/2a371368c91789a4d689d​​6a84eb20b238c37678a/activesupport/lib/active_support/core_ext/object/blank.rb#L101

于 2013-05-02T00:16:05.053 回答
4

你总是可以做 Rails 做的事情。如果您查看源代码blank,您会看到它添加了以下方法Object

# File activesupport/lib/active_support/core_ext/object/blank.rb, line 14
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
于 2013-05-02T01:55:50.530 回答
2

Ruby 中不存在这样的功能,但String#blank?ruby​​-core上有一个积极的提议。

同时,您可以使用此实现:

class String
  def blank?
    !include?(/[^[:space:]]/)
  end
end

这种实现将非常有效,即使对于很长的字符串也是如此。

于 2013-05-02T13:23:34.510 回答
1

假设您的字符串可以被剥离,有什么问题str.nil? or str.strip.empty?如下:

2.0.0p0 :004 > ' '.nil? or ' '.strip.empty? 
 => true 
于 2013-05-02T00:11:55.227 回答
1

怎么样的东西:

str.to_s.empty?

于 2013-05-02T00:13:16.217 回答
0

任何新寻找这个的人,都可以使用simple_ext gem。这个 gem 可以帮助你在 Rails 中的 Array、String、Hash 等对象上使用所有 Ruby 核心扩展。

require 'simple_ext'
str.blank?
arr.blank?
... etc.
于 2020-02-09T14:18:08.657 回答