2013-04-16 6 views
5

У меня есть рубин массив, и это nil, но когда я проверяю с помощью nil? и blank? возвращает falseрубин массив для нулевого массива

@a = [""] 

@a.nil? 
=> false 

@a.empty? 
=> false 

Как проверить на ноль при условии, что возвращение верно?

+2

'[" "]' is _not_ nil. Что ты пытаешься сделать? – Dogbert

+0

Я получаю массив [""], если этот массив приближается, тогда он не должен попасть во внутреннюю часть блока. –

+1

Просто выполните 'if @a == [" "]'? – Dogbert

ответ

20

[""] - массив с одним элементом, содержащим пустой объект String. [].empty? вернется true. @a.nil? возвращает false, потому что @a является объектом Array, а не nil.

Примеры:

"".nil? # => false 
[].nil? # => false 
[""].empty? # => false 
[].empty? # => true 
[""].all? {|x| x.nil?} # => false 
[].all? {|x| x.nil?} # => true 
[].all? {|x| x.is_a? Float} # => true 
# An even more Rubyish solution 
[].all? &:nil? # => true 

Это демонстрирует, что последняя строка [].all? будет всегда возвращение правды, потому что, если массив пуст, то, по определению, все его элементов (без элементов) не выполняют все условия.

13

В рубин, вы можете проверить, как это

[""].all? {|i| i.nil? or i == ""} 

Если вы на рельсах, вы могли бы сделать

[""].all? &:blank? 
1
p defined? "" #=> "expression" 
p defined? nil #=> "nil" 

Один "" вы думаете, как nil, на самом деле expression , Посмотрите на размере массива в empty и non-empty массиве как ниже для получения дополнительного доказательства:

p [].size #=> 0 
p [""].size #=> 1 

Саид вашего #nil? и #empty дает false. Что ожидается.

Смежные вопросы