2012-11-06 10 views
11

Prima di tutto ho trovato due articoli utili in documentazioni su questi metodi:ruby's "any?" e tutto?" comportamento metodi sugli array e hash vuoti

tutto ?: passa ogni elemento del raccolta al blocco dato. Il metodo restituisce true se il blocco non restituisce mai false o nil.

any ?: Passa ogni elemento della raccolta al blocco indicato. Il metodo restituisce true se il blocco restituisce mai un valore diverso da false o nil.

Ma in caso di array e hash vuoti ho ottenuto:

irb(main):004:0> [nil, "car", "bus"].all? 
=> false 
irb(main):005:0> ["nil", "car", "bus"].all? 
=> true 
irb(main):006:0> [].all? 
=> true 
irb(main):007:0> ["nil", "car", "bus"].any? 
=> true 
irb(main):008:0> [nil, "car", "bus"].any? 
=> true 
irb(main):009:0> [nil].any? 
=> false 
irb(main):010:0> [].any? 
=> false 

Qualcuno può spiegare a me perché le matrici vuote mi danno false nel caso del metodo any? e true in caso di all??

+4

In termini matematici: "any?" È una piega di OR logico il cui elemento di identità è 'false'. D'altra parte 'all?' È una piega di AND logico, il cui elemento di identità è 'true'. http://en.wikipedia.org/wiki/Identity_element – tokland

risposta

16

Il metodo restituisce true se il blocco non restituisce mai false o nil.

Quindi, poiché il blocco non viene mai chiamato, ovviamente non restituisce mai false o nil, quindi all restituisce true.

Lo stesso vale per any:

Il metodo restituisce true se il blocco mai restituisce un valore diverso da falso o nullo.

Poiché il blocco non viene mai chiamato, non restituisce mai un valore diverso da false o nil, pertanto any restituisce false.