2013-04-16 28 views
5

Tôi có mảng ruby ​​và nó là nil nhưng khi tôi kiểm tra sử dụng nil?blank? nó trả falseruby ​​mảng kiểm tra các mảng nil

@a = [""] 

@a.nil? 
=> false 

@a.empty? 
=> false 

Làm thế nào để kiểm tra các điều kiện nil đó trở thành sự thật?

+2

'[" "]' là _not_ nil. Bạn đang cố làm gì vậy? – Dogbert

+0

Tôi nhận được mảng [""] nếu mảng này đến sau đó nó không nên đi vào phần bên trong của khối. –

+1

Chỉ cần làm 'if @a == [" "]'? – Dogbert

Trả lời

20

[""] là một mảng có phần tử đơn chứa đối tượng Chuỗi trống. [].empty? sẽ trả lại true. @a.nil? đang trả lại false@a là đối tượng mảng, chứ không phải nil.

Ví dụ:

"".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 

Đó dòng cuối cùng chứng minh rằng [].all? sẽ luôn trở thành sự thật, bởi vì nếu một mảng trống sau đó theo định nghĩa tất cả các yếu tố của nó (không tố) đáp ứng mọi điều kiện.

13

Trong ruby, bạn có thể kiểm tra như thế này

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

Nếu bạn đang ở trên đường ray, bạn có thể làm

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

Một "" bạn đang nghĩ như nil, thực sự là một expression . Nhìn vào kích thước của một mảng emptynon-empty mảng như dưới đây để biết thêm bằng chứng:

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

Nói #nil?#empty bạn mang đến cho false. Đó là dự kiến.

Các vấn đề liên quan