我发现自己一再在Ruby on Rails中寻找nil?
,blank?
和empty?
差异的明确定义。这是我最接近的地方:
blank?
个对象为false,空或空白字符串。例如,""
," "
,nil
,[]
和{}
为空。
nil?
个对象是NilClass的实例。
empty?
对象是特定于类的,并且定义因类而异。如果字符串没有字符,则该字符串为空;如果字符串不包含任何项目,则该字符串为空。
是否有任何遗漏,或者可以进行更严格的比较?
答案 0 :(得分:1369)
.nil?
可用于任何对象,如果对象为零,则为true。
.empty?
可用于字符串,数组和散列,并在以下情况下返回true:
对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)
我用所有案例制作了这个有用的表:
blank?
,present?
由Rails提供。
答案 2 :(得分:198)
答案 3 :(得分:58)
快速提示:!obj.blank? == obj.present?
在某些表达方式中,眼睛可以更方便/更容易
答案 4 :(得分:47)
一个区别是.nil?
和.empty?
是由编程语言Ruby提供的方法,而.blank?
是由Web开发框架Rails提供的added。
答案 5 :(得分:27)
nil?
is blank?
empty?
is blank?
empty?
is nil?
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 something
或unless 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?
方法可用于检查数据库中是否存在数据。它返回布尔值true
或false
。
答案 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 种答案,但我喜欢这里解释的方式,所以又发布了一个答案:-)
看看下面的指标 - 它的自我解释以及在可用方法中使用的各种数据类型。
参考:https://blog.appsignal.com/2018/09/11/differences-between-nil-empty-blank-and-present.html