# 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
回答
當然,可以這樣做:
odd, even = list.partition &:odd?
真棒 - 謝謝;有趣的是它顯示在可枚舉的文檔上 - http://ruby-doc.org/core-1.9.2/Enumerable.html但不在數組上? – house9 2013-04-05 23:59:53
@ house9 Enumerable是一個混合類,所以很多類都可以使用它。哈希也使用它們。 – MrDanA 2013-04-06 04:57:02
這是因爲它是在'Enumerable'上定義的,而不是在'Array'上定義的。這被稱爲* inheritance *,是Ruby和許多其他語言的基本概念之一,而不僅僅是面向對象的概念。 – 2013-04-06 07:51:52
odd = []
even = []
list = [1..20]
list.each {|x| x.odd? ? odd << x : even << x }
正如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}
你可以嘗試以下:
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]
- 1. 紅寶石陣列,[]操作
- 2. 兩個紅寶石陣列
- 3. 紅寶石陣列和地圖方法
- 4. 紅寶石陣列更新操作
- 5. Perl /紅寶石單線陣列操作
- 6. 紅寶石陣列注入
- 7. 紅寶石枚舉列表
- 8. 紅寶石陣列減法?
- 9. 紅寶石陣列
- 10. 陣列陣列,個別陣列紅寶石
- 11. 紅寶石 - 在一個陣列
- 12. 紅寶石:在陣列
- 13. 在陣列紅寶石
- 14. 紅寶石有陣列方法選擇!或不?
- 15. 紅寶石陣列#選擇一個選項哈希匹配
- 16. 紅寶石陣列從1開始
- 17. 集的效率操作VS在紅寶石陣列操作
- 18. 平均幾個紅寶石陣列
- 19. 紅寶石陣列包括一個id
- 20. 迭代一個YAML陣列紅寶石
- 21. 添加兩個紅寶石陣列
- 22. 紅寶石多個陣列比較
- 23. 陣列與多個條件紅寶石
- 24. 紅寶石排序兩個陣列
- 25. 供應紅寶石陣列選擇一個動態塊
- 26. 紅寶石陣列範圍
- 27. 紅寶石陣列切片
- 28. 紅寶石陣列內部
- 29. 陣列中的紅寶石
- 30. 紅寶石陣列換行
內置的方法很不錯,但你不是添加自己的方法到'數組'這將做到這一點? – MrDanA 2013-04-05 23:47:49
是的,我正在考慮猴子修補陣列來添加它 - 看起來像紅寶石可能已經內置的東西,但沒有看到任何文檔 – house9 2013-04-05 23:50:33