提问



我发现自己反复寻找Ruby on Rails中nil?blank?empty?差异的明确定义。这是我最接近的人:



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

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

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



有什么遗漏,或者可以做出更严格的比较吗?

最佳参考


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


.empty?可用于字符串,数组和散列,如果出现以下情况,则返回true:



  • 字符串长度== 0

  • 数组长度== 0

  • 哈希长度== 0



在nil的东西上运行.empty?会抛出NoMethodError


这就是.blank?的用武之地。它由Rails实现,可以在任何对象上运行,也可以在.empty?上对字符串,数组和散列起作用。[93]


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还提供.present?,它返回.blank?的否定。[94]


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


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

其它参考1


我用所有的情况制作了这个有用的表格:




其它参考2


只要扩展朱利安的表:


[95]


参考:空?空白?无?傻傻分不清楚[96]

其它参考3


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


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

其它参考4


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

其它参考5


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


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


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

其它参考6


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


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

其它参考7


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

其它参考8


[98]



  • nil?的所有内容都是blank?

  • empty?的所有内容都是blank?

  • 没有empty?nil?

  • 没有nil?empty?



tl; dr - 仅使用blank?& present?除非你想区分""" "

其它参考9


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


b = nil
b.nil? # => true


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


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

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


empty?不能在nil个对象上调用。


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

其它参考10


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


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


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

其它参考11


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

其它参考12


Rails 4


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


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


一个人也可以这样做:


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

其它参考13


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


例如:


example = nil
example.nil?  # true

"".nil?  # false


基本上nil?只有在对象实际上等于nil时才会返回true。


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


例如:


"".empty? # true
"hi".empty?   # false
{}.empty?  # true
{"" => ""}.empty?   # false
[].empty?   # true
[nil].empty?  # false

nil.empty?  # NoMethodError: undefined method `empty?' for nil:NilClass


请注意,empty?不能在nil对象上调用,因为nil对象不是集合,它会引发异常。


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


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