2014-11-21 105 views
1

當字符串模式時,是否可以對不同枚舉項進行「求和」? 每個例子是這樣的? (當然,我知道這是行不通的。)如何在Ruby中「枚舉」可枚舉項

(('a'..'z') + ('A'..'Z')).to_a 

注: 我問有關獲取串字符數組,從a到z和從A到Z的所有在一起。 關於字符串模式我的意思是字符會出現像[「a」,「b」,.....,「Y」,「Z」]

+3

您的預期結果是什麼? 52個元素(所有大寫和小寫字母)的數組? – 2014-11-21 12:17:21

+0

是的。類似的東西。 – RadW2020 2014-11-21 12:50:19

+0

預期輸出是什麼?你在問如何解除兩個'Enumerable'的加法運算嗎?什麼是「字符串模式」? – 2014-11-21 12:57:16

回答

9

可以使用splat操作:

[*('A'..'Z'), *('a'..'z')] 
+3

即使沒有括號的作品:'[*'A'..'Z',*'a'..'z']' – Stefan 2014-11-21 13:34:08

+0

不幸的是,根據更新後的問題,這個答案不再正確。 – 2014-11-21 13:35:51

+0

這是輝煌的,爲我操作優雅。對不起,如果我的英語創造了誤會。 – RadW2020 2014-11-21 17:46:36

4

喜歡這個?

[('a'..'z'), ('A'..'Z')].map(&:to_a).flatten 

或者這個?

('a'..'z').to_a + ('A'..'Z').to_a 
+3

'[('A'..'Z'),('a'。 .'z')]。flat_map(&:to_a)'更短;) – 2014-11-21 12:36:10

+0

你說得對。我總是忘記'flat_map' ... – spickermann 2014-11-21 12:40:45

+0

不幸的是,根據更新後的問題,這個答案不再正確。 – 2014-11-21 13:36:10

2

沒有回答,但答案的標杆:

require 'benchmark' 

n = 100000 
Benchmark.bm do |x| 
    x.report("flat_map : ") { n.times do ; [('A'..'Z'), ('a'..'z')].flat_map(&:to_a) ; end } 
    x.report("map.flatten: ") { n.times do ; [('A'..'Z'), ('a'..'z')].map(&:to_a).flatten ; end } 
    x.report("splat  : ") { n.times do ; [*('A'..'Z'), *('a'..'z')] ; end } 
    x.report("concat arr : ") { n.times do ; ('A'..'Z').to_a + ('a'..'z').to_a ; end } 
end 

結果:

#=>  user  system  total  real 
#=> flat_map : 0.858000 0.000000 0.858000 ( 0.883630) 
#=> map.flatten: 1.170000 0.016000 1.186000 ( 1.200421) 
#=> splat  : 0.858000 0.000000 0.858000 ( 0.857728) 
#=> concat arr : 0.812000 0.000000 0.812000 ( 0.822861) 
+0

不幸的是,根據更新後的問題,這個答案不再正確。 – 2014-11-21 13:36:29

+0

你爲什麼這麼說?所有四個選項對於所提問題的目的都是一樣的。 – RadW2020 2014-11-21 17:55:45

+0

@ RadW2020:那麼,你改變了你的問題,詢問與你之前完全相反的順序。當我寫下我的答案並寫下評論時,您的問題問到如何以相反的順序獲取數組。現在,你的問題問如何讓他們按照他們出現的順序。當然,在你做出這些改變之前所寫的任何內容都將毫無意義。 – 2014-11-22 12:02:56

0

由於要從要素第一Range是在輸出Array年底和的元素最後Range是在開始輸出Array,但仍保持內各Range相同的順序,我會做這樣的(這也很好地推廣到兩個以上Enumerable S):

def backwards_concat(*enums) 
    enums.reverse.map(&:to_a).inject([], &:concat) 
end 

backwards_concat('A'..'Z', 'a'..'z') 
0
['a'..'z'].concat(['A'..'Z']) 

這可能是歸仁最簡單的方法來做到這一點。

+0

這是錯的。這是你的輸出「​​a..zA..Z」。 concat是用於字符串的。 – RadW2020 2014-11-21 17:44:13

0

關於字符串模式我的意思是會出現像字符[ 「A」, 「B」,..., 「Y」, 「Z」]

爲了回答上述:

Array('a'..'z').concat Array('A'..'Z')