我想知道在ruby 1.9中是否有更规范的方法可以做到这一点
我有一个包含大量对象的数组,我想使用数组中每个对象的属性将它们分组为Hash.
很简单的例子:
> sh = {}
=> {}
> aers = %w(a b c d ab bc de abc)
=> ["a", "b", "c", "d", "ab", "bc", "de", "abc"]
> aers.each do |aer|
> sh[aer.size] = [] if sh[aer.size].nil?
> sh[aer.size] << aer
> end
=> ["a", "b", "c", "d", "ab", "bc", "de", "abc"]
> sh
=> {1=>["a", "b", "c", "d"], 2=>["ab", "bc", "de"], 3=>["abc"]}
Run Code Online (Sandbox Code Playgroud)
我试过这个,但它的输出是错误的(你可以看到):
sh = Hash.new([])
=> {}
> aers.each do |aer|
> sh[aer.size] << aer
> end
=> ["a", "b", "c", "d", "ab", "bc", "de", "abc"]
> sh
=> {}
Run Code Online (Sandbox Code Playgroud)
Phr*_*ogz 39
Ruby已经预见到了您的需求,并且让您满意Enumerable#group_by
:
irb(main):001:0> aers = %w(a b c d ab bc de abc)
#=> ["a", "b", "c", "d", "ab", "bc", "de", "abc"]
irb(main):002:0> aers.group_by{ |s| s.size }
#=> {1=>["a", "b", "c", "d"], 2=>["ab", "bc", "de"], 3=>["abc"]}
Run Code Online (Sandbox Code Playgroud)
在Ruby 1.9中,您可以通过以下方式缩短它:
irb(main):003:0> aers.group_by(&:size)
#=> {1=>["a", "b", "c", "d"], 2=>["ab", "bc", "de"], 3=>["abc"]}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9164 次 |
最近记录: |