2016-08-03 200 views
2

我覺得這種行爲很奇怪如何檢查是否一個數組包含浮法:: NAN

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

我嘗試這樣做,然後找來驚訝

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

所以,檢查Float::NAN,我有訴諸

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

所以,

  1. 有沒有更好的方法來檢查數組中的Float::NAN
  2. 爲什麼Float::NAN會出現這種奇怪的行爲?
+0

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

回答

2

要檢查,你可以使用:

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

(或try,如果你使用的Rails)

至於爲什麼,看看What is the rationale for all comparisons returning false for IEEE754 NaN values?

+1

優秀的答案!這會工作嗎[[1,2,3,'a','b',Float :: NAN] .any? {| e | e!= e}#=> true'?也就是說,是否還有其他的'e!= 3#=> true'的其他Ruby對象'e'? –

+0

好主意,但恐怕會大大增加wtf/loc比率。 :)順便說一句,我不知道是否有其他類以這種方式重新定義了==。 –

相關問題