我发现自己反复寻找Ruby on Rails中nil?、blank?和empty?差异的明确定义。这是我最接近的:
nil?
blank?
empty?
blank?对象为false、空或空格字符串。例如,""、" "、nil、[]和{}为空。
""
" "
nil
[]
{}
nil?对象是NilClass的实例。
empty?对象是类特定的,定义因类而异。如果字符串没有字符,则为空,如果数组不包含任何项目,则为空。
有没有遗漏什么,或者可以进行更严格的比较?
一个区别是.nil?和.empty?是由编程语言Ruby提供的方法,而.blank?是由Web开发框架Rails提供的添加。
.nil?
.empty?
.blank?
不要忘记any?,它通常是!empty?。在Rails中,我通常用if something或unless something检查语句末尾是否存在某些内容,然后在需要的地方使用blank?,因为它似乎在任何地方都有效。
any?
!empty?
if something
unless something
.nil?可以用于任何对象,如果对象为nil,则为true。
.empty?可以用于字符串、数组和哈希,如果:
在nil上运行.empty?会抛出NoMethodError。
NoMethodError
这就是.blank?的用武之地。它是由Rails实现,可以对任何对象进行操作,也可以像.empty?一样对字符串、数组和哈希进行操作。
nil.blank? == truefalse.blank? == true[].blank? == true{}.blank? == true"".blank? == true5.blank? == false0.blank? == false
.blank?还在非空但仅包含空格的字符串上计算true:
" ".blank? == true" ".empty? == false
Rails还提供.present?,返回.blank?的否定。
.present?
数组问题:即使数组的所有元素都是空白,blank?也会返回false。要确定这种情况下的空白,请使用all?和blank?,例如:
false
all?
[ nil, '' ].blank? == false[ nil, '' ].all? &:blank? == true
关于any?建议的一点说明:他是对的,它的一般等效于!empty?。然而,any?将返回true到一串空白(ala" ")。
true
当然,也请参阅上面的1.9评论。
快速提示:!obj.blank? == obj.present?
!obj.blank? == obj.present?
在某些表情中可以方便/更容易对眼睛
一个特殊情况是当尝试评估布尔值是否为nil时:
false.present? == falsefalse.blank? == truefalse.nil? == false
在这种情况下,建议使用.nil?
我用所有的案例制作了这个有用的表格:
blank?、present?由Rails提供。
present?
扩展朱利安的表:
参考:空?空?空?傻傻分不清楚
nil?是一个标准的Ruby方法,可以对所有对象调用,如果对象是nil,则返回true:
b = nilb.nil? # => true
empty?是一个标准的Ruby方法,可以在一些对象上调用,例如Strings、数组和哈希,如果这些对象不包含元素,则返回true:
a = []a.empty? # => true b = ["2","4"]b.empty? # => false
empty?不能在nil对象上调用。
blank?是一个Rails方法,可以对nil对象以及空对象调用。
其他人都很好地解释了区别是什么。
我想添加在Ruby On Rails中,最好使用obj.blank?或obj.present?而不是obj.nil?或obj.empty?。
obj.blank?
obj.present?
obj.nil?
obj.empty?
obj.blank?处理所有类型nil、''、[]、{},如果值不可用则返回true,如果值在任何类型的对象上都可用则返回false。
''
Rails 4
@corban-brook的“数组明白了:空白?”的替代方案,用于检查数组是否仅包含空值并且可以被视为空白?true:
[ nil, '' ].all? &:blank? == true
也可以这样做:
[nil, '', "", " ",' '].reject(&:blank?).blank? == true
nil?可以用于任何对象。它确定对象是否有任何值,包括“空白”值。
例如:
example = nilexample.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
请注意,不能对nil对象调用empty?,因为nil对象不是集合,它会引发异常。
另请注意,即使集合中的项为空,也不意味着集合为空。
blank?基本上是nil?和empty?的组合,它对于检查您认为是集合的对象很有用,但也可能是nil。
exists?方法可用于检查数据是否存在于数据库中。它返回布尔值true或false。
exists?
tl; dr--除非您想区分""和" ",否则仅使用blank?和present?
虽然这个问题有n个答案,但我喜欢这里解释的方式,所以又发布了一个答案:-)
看下面的数据指标-它与跨可用方法使用的各种数据类型不言而喻。
参考:https://blog.appsignal.com/2018/09/11/differences-between-nil-empty-blank-and-present.html