2016-08-03 16 views
2

ich dieses Verhalten finden eher seltsamWie überprüfen, ob ein Array Float enthält :: NAN

> [1, 2, 3, 'a', 'b', Float::NAN].include? Float::NAN 
false 

habe ich versucht, diese dann und bekam überrascht

> Float::NAN == Float::NAN 
false 

Also, für Float::NAN zu überprüfen, hatte ich So greifen

zu

> [1, 2, 3, 'a', 'b', Float::NAN].any? { |i| i.is_a?(Float) && i.nan? } 
true 

,

  1. Gibt es eine bessere Möglichkeit, in einem Array nach Float::NAN zu suchen?
  2. Warum gibt es so ein komisches Verhalten mit Float::NAN?
+0

https: //www.ruby-forum.com/topic/6726568 –

Antwort

2

zu überprüfen, können Sie verwenden:

[1, 2, 3, 'a', 'b', Float::NAN].any?{|item| item.respond_to?(:nan?) && item.nan?} 

(oder try, wenn Sie Rails verwenden)

Und wie für warum, werfen Sie einen Blick auf What is the rationale for all comparisons returning false for IEEE754 NaN values?

+1

Ausgezeichnete Antwort! Würde das funktionieren? [1, 2, 3, 'a', 'b', Float :: NAN] .eine? {| e | e! = e} # => wahr '? Das heißt, gibt es andere Ruby-Objekte "e", für die "e! = 3 # => true"? –

+0

Gute Idee, aber ich fürchte, es würde das wtf/loc-Verhältnis beträchtlich erhöhen. :) BTW, ich habe keine Ahnung, ob irgendeine andere Klasse '==' so umdefiniert hat. –