在Ruby on Rails中对nil v。空v。空白的简要解释

时间:2009-05-19 22:51:37

标签: ruby-on-rails ruby

我发现自己一再在Ruby on Rails中寻找nil?blank?empty?差异的明确定义。这是我最接近的地方:

  • blank?个对象为false,空或空白字符串。例如,""" "nil[]{}为空。

  • nil?个对象是NilClass的实例。

  • empty?对象是特定于类的,并且定义因类而异。如果字符串没有字符,则该字符串为空;如果字符串不包含任何项目,则该字符串为空。

是否有任何遗漏,或者可以进行更严格的比较?

15 个答案:

答案 0 :(得分:1369)

.nil?可用于任何对象,如果对象为零,则为true。

.empty?可用于字符串,数组和散列,并在以下情况下返回true:

  • 字符串长度== 0
  • 数组长度== 0
  • 哈希长度== 0

对nil的内容运行.empty?会抛出NoMethodError

这就是.blank?的用武之地。它是implemented by Rails,可以对任何对象进行操作,也可以像.empty?一样对字符串,数组和哈希进行操作。

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

.blank?也会对非空的字符串求值为true,但只包含空格:

"  ".blank? == true
"  ".empty? == false

Rails also provides .present?,返回.blank?的否定。

数组问题:即使数组的所有元素都为空,blank?也会返回false。要确定此情况下的空白,请将all?blank?一起使用,例如:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 

答案 1 :(得分:638)

我用所有案例制作了这个有用的表:

enter image description here

blank?present?由Rails提供。

答案 2 :(得分:198)

只需延伸朱利安的表格:

enter image description here

参考:empty?blank?nil?傻傻分不清楚

答案 3 :(得分:58)

快速提示:!obj.blank? == obj.present?

在某些表达方式中,眼睛可以更方便/更容易

答案 4 :(得分:47)

一个区别是.nil?.empty?是由编程语言Ruby提供的方法,而.blank?是由Web开发框架Rails提供的added

答案 5 :(得分:27)

enter image description here

  • Everything that is nil? is blank?
  • Everything that is empty? is blank?
  • Nothing that is empty? is nil?
  • Nothing that is nil? is empty?

tl;dr -- only use blank? & present? unless you want to distinguish between "" and " "

答案 6 :(得分:12)

一个特例是在尝试评估布尔值是否为nil时:

false.present? == false
false.blank? == true
false.nil? == false

在这种情况下,建议使用.nil?

答案 7 :(得分:10)

关于any?建议的一点注意事项:他是正确的一般等同于!empty?。但是,any?会将true返回给只有空格的字符串(ala " ")。

当然,请参阅上面的1.9评论。

答案 8 :(得分:9)

不要忘记any?,一般为!empty?。在Rails中,我通常会在if somethingunless something的语句末尾检查是否存在某些内容,然后在需要的地方使用blank?,因为它似乎无处不在。

答案 9 :(得分:8)

nil?是一个标准的Ruby方法,可以在所有对象上调用,如果对象是true则返回nil

b = nil
b.nil? # => true

empty?是一个标准的Ruby方法,可以在一些对象(如字符串,数组和哈希)上调用,如果这些对象不包含任何元素,则返回true

a = []
a.empty? # => true

b = ["2","4"]
b.empty? # => false

empty?无法在nil个对象上调用。

blank?是一个Rails方法,可以在nil个对象和空对象上调用。

答案 10 :(得分:4)

其他人都很好地解释了有什么区别。

我想在Ruby On Rails中添加,最好使用obj.blank?obj.present?代替obj.nil?obj.empty?

obj.blank?处理所有类型nil''[]{},如果值不可用则返回true并返回{ {1}}如果值可用于任何类型的对象。

答案 11 :(得分:3)

exists?方法可用于检查数据库中是否存在数据。它返回布尔值truefalse

答案 12 :(得分:2)

Rails 4

替换@ corban-brook的'数组问题:空白?' 用于检查数组是否只包含空值并且可以视为空白?真:

[ nil, '' ].all? &:blank? == true

也可以这样做:

[nil, '', "", " ",'  '].reject(&:blank?).blank? == true

答案 13 :(得分:1)

109 0 109 0 可用于任何对象。它确定对象是否具有任何值,包括'空白'值。

例如:

nil?

基本上example = nil example.nil? # true "".nil? # false 只有在对象实际上等于' nil'时才会返回true。

nil?仅在被视为集合的对象上调用。这包括字符串(字符集合),哈希(键/值对的集合)和数组(任意对象的集合)之类的东西。 empty?如果集合中没有项目,则返回true。

例如:

empty?

请注意,无法在nil对象上调用"".empty? # true "hi".empty? # false {}.empty? # true {"" => ""}.empty? # false [].empty? # true [nil].empty? # false nil.empty? # NoMethodError: undefined method `empty?' for nil:NilClass ,因为nil对象不是集合,它会引发异常。

另请注意,即使集合中的项目为空白,也不表示集合为空。

empty?基本上是blank?nil?的组合。它对于检查您认为是集合的对象非常有用,但也可能是零。

答案 14 :(得分:0)

虽然这个问题有 n 种答案,但我喜欢这里解释的方式,所以又发布了一个答案:-)

看看下面的指标 - 它的自我解释以及在可用方法中使用的各种数据类型。

The Metrics way of understanding functionality

参考:https://blog.appsignal.com/2018/09/11/differences-between-nil-empty-blank-and-present.html