2014-07-18 42 views
1
a = [1, 2, 3..9, 10, 15, 20..43] 
print a.include?(5) # Returns false 

我期待它返回true,但3..9未翻譯爲[3,4,5,6,7,8,9]具有範圍值的數組?

我錯過了一些愚蠢的東西,但我無法弄清楚。基本上我想用常規的fixnums和範圍來初始化它。

回答

7

你必須圖示它

a = [1, 2, *3..9, 10, 15, 20..43] 
a.include?(5) # => true 
+0

謝謝,解決了它。 – Napoleon

+0

雖然要小心噴濺範圍。通過濺出諸如'* 1..1_000_000_000_000'等範圍來創建一個不適合內存的數組是非常容易的。範圍是表達一個大序列的一種非常有效的方式,所以如果你使用大範圍,最好是實施一個智能條件測試,知道如何與單個值進行比較,並將其包含在範圍內。 –

+2

爲什麼不摔打第二個範圍呢? [1,2,* 3..9,10,15,* 20..43] – Nishu

1

另一種解決方案,而無需圖示。

a = [1, 2, 3..9, 10, 15, 20..43] 

a.any? {|i| i.kind_of?(Range) ? i.include?(5) : i == 5 } 
# => true 
3

如果你想一個「懶惰」的方式,不需要你的範圍轉換成數組元素,嘗試使用===(情況equality)運算符。

a = [1, 2, 3..9, 10, 15, 20..43] 
a.any? { |x| x === 5 } 

我推薦使用這種方法,因爲它比將範圍劃分爲單獨的元素要有效得多。