2013-04-05 20 views
7
# this code works 
list = (0..20).to_a 
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 

odd = list.select { |x| x.odd? } 
# => [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 

list.reject! { |x| x.odd? } 
# => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 

# but can i emulate this type of functionality with an enumerable method? 
set = [1,5,10] 
# => [1, 5, 10] 
one, five, ten = set 
# => [1, 5, 10] 
one 
# => 1 
five 
# => 5 
ten 
# => 10 

# ------------------------------------------------ 
# method I am looking for ? 
list = (0..20).to_a 
odd, even = list.select_with_reject { |x| x.odd? } 
# put the matching items into the first variable 
# and the non-matching into the second 
+0

內置的方法很不錯,但你不是添加自己的方法到'數組'這將做到這一點? – MrDanA 2013-04-05 23:47:49

+0

是的,我正在考慮猴子修補陣列來添加它 - 看起來像紅寶石可能已經內置的東西,但沒有看到任何文檔 – house9 2013-04-05 23:50:33

回答

11

當然,可以這樣做:

odd, even = list.partition &:odd? 
+0

真棒 - 謝謝;有趣的是它顯示在可枚舉的文檔上 - http://ruby-doc.org/core-1.9.2/Enumerable.html但不在數組上? – house9 2013-04-05 23:59:53

+1

@ house9 Enumerable是一個混合類,所以很多類都可以使用它。哈希也使用它們。 – MrDanA 2013-04-06 04:57:02

+0

這是因爲它是在'Enumerable'上定義的,而不是在'Array'上定義的。這被稱爲* inheritance *,是Ruby和許多其他語言的基本概念之一,而不僅僅是面向對象的概念。 – 2013-04-06 07:51:52

1
odd = [] 
even = [] 
list = [1..20] 
list.each {|x| x.odd? ? odd << x : even << x } 
0

正如pguardiario所說,partition方法是最直接的方式。你也可以使用Set#divide

require 'set' 
list = (1..10).to_a 
odd, even = Set.new(list).divide(&:odd?).to_a.map{|x| x.to_a} 
0

你可以嘗試以下:

odd,even = (0..20).group_by(&:odd?).values 
p odd,even 

輸出:

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]