[#33640] [Ruby 1.9-Bug#4136][Open] Enumerable#reject should not inherit the receiver's instance variables — Hiro Asari <redmine@...>

Bug #4136: Enumerable#reject should not inherit the receiver's instance variables

10 messages 2010/12/08

[#33667] [Ruby 1.9-Bug#4149][Open] Documentation submission: syslog standard library — mathew murphy <redmine@...>

Bug #4149: Documentation submission: syslog standard library

11 messages 2010/12/10

[#33683] [feature:trunk] Enumerable#categorize — Tanaka Akira <akr@...>

Hi.

14 messages 2010/12/12
[#33684] Re: [feature:trunk] Enumerable#categorize — "Martin J. Dst" <duerst@...> 2010/12/12

[#33687] Towards a standardized AST for Ruby code — Magnus Holm <judofyr@...>

Hey folks,

23 messages 2010/12/12
[#33688] Re: Towards a standardized AST for Ruby code — Charles Oliver Nutter <headius@...> 2010/12/12

On Sun, Dec 12, 2010 at 9:55 AM, Magnus Holm <judofyr@gmail.com> wrote:

[#33689] Re: Towards a standardized AST for Ruby code — "Haase, Konstantin" <Konstantin.Haase@...> 2010/12/12

On Dec 12, 2010, at 17:46 , Charles Oliver Nutter wrote:

[#33763] [Ruby 1.9-Bug#4168][Open] WeakRef is unsafe to use in Ruby 1.9 — Brian Durand <redmine@...>

Bug #4168: WeakRef is unsafe to use in Ruby 1.9

43 messages 2010/12/17

[#33815] trunk warnflags build issue with curb 0.7.9? — Jon <jon.forums@...>

As this may turn out to be a 3rd party issue rather than a bug, I'd like some feedback.

11 messages 2010/12/22

[#33833] Ruby 1.9.2 is going to be released — "Yuki Sonoda (Yugui)" <yugui@...>

-----BEGIN PGP SIGNED MESSAGE-----

15 messages 2010/12/23

[#33846] [Ruby 1.9-Feature#4197][Open] Improvement of the benchmark library — Benoit Daloze <redmine@...>

Feature #4197: Improvement of the benchmark library

15 messages 2010/12/23

[#33910] [Ruby 1.9-Feature#4211][Open] Converting the Ruby and C API documentation to YARD syntax — Loren Segal <redmine@...>

Feature #4211: Converting the Ruby and C API documentation to YARD syntax

10 messages 2010/12/26

[#33923] [Ruby 1.9-Bug#4214][Open] Fiddle::WINDOWS == false on Windows — Jon Forums <redmine@...>

Bug #4214: Fiddle::WINDOWS == false on Windows

15 messages 2010/12/27

[ruby-core:33684] Re: [feature:trunk] Enumerable#categorize

From: "Martin J. Dst" <duerst@...>
Date: 2010-12-12 12:38:11 UTC
List: ruby-core #33684

On 2010/12/12 20:13, Tanaka Akira wrote:
> Hi.
>
> How about a method for converting enumerable to hash?

There are already such methods. At least group_by. Your proposal seems 
to be a very special way to convert an enumerable to a hash.

>    enum.categorize([opts]) {|elt| [key1, ..., val] } ->  hash
>
> categorizes the elements in _enum_ and returns a hash.
>
> The block is called for each elements in _enum_.
> The block should return an array which contains
> one or more keys and one value.
>
>    p (0..10).categorize {|e| [e % 3, e % 5] }
>    #=>  {0=>[0, 3, 1, 4], 1=>[1, 4, 2, 0], 2=>[2, 0, 3]}

I'm trying to understand your example. Let me make a table.

original value     return_value[0]    return_value[1]
0                  0                  0
1                  1                  1
2                  2                  2
3                  0                  3
4                  1                  4
5                  2                  0
6                  0                  1
7                  1                  2
8                  2                  3
9                  0                  4
10                 1                  0

I think I get the idea of how this is supposed to work. But I'm not sure 
what the actual use cases would be. Can you give some?

For this variant, a Ruby equivalent is:

h = {}
(0..10).each do |e|
   h[e%3] ||= []
   h[e%3] << e%5
end
p h

Or shorter:

h = {}
(0..10).each { |e| (h[e%3] ||= []) << e%5 }
p h

I admit that it is more elegant if the initialization and the final line 
can be avoided, but I think that's an issue that can be dealt with 
separately.

> The keys and value are used to construct the result hash.
> If two or more keys are provided
> (i.e. the length of the array is longer than 2),
> the result hash will be nested.
>
>    p (0..10).categorize {|e| [e&4, e&2, e&1, e] }
>    #=>  {0=>{0=>{0=>[0, 8],
>    #            1=>[1, 9]},
>    #        2=>{0=>[2, 10],
>    #            1=>[3]}},
>    #    4=>{0=>{0=>[4],
>    #            1=>[5]},
>    #        2=>{0=>[6],
>    #            1=>[7]}}}
>
> The value of innermost hash is an array which contains values for
> corresponding keys.
> This behavior can be customized by :seed, :op and :update option.
>
> This method can take an option hash.
> Available options are follows:

Who will be able to remember exactly what these options are,...? Most 
other methods, in particular on Enumerables, don't have that many 
options. I think that's for a good reason.

Regards,   Martin.


> - :seed specifies seed value.
> - :op specifies a procedure from seed and value to next seed.
> - :update specifies a procedure from seed and block value to next seed.
>
> :seed, :op and :update customizes how to generate
> the innermost hash value.
> :seed and :op behavies like Enumerable#inject.
>
> If _seed_ and _op_ is specified, the result value is generated as follows.
>    op.call(..., op.call(op.call(seed, v0), v1), ...)
>
> :update works as :op except the second argument is the block value itself
> instead of the last value of the block value.
>
> If :seed option is not given, the first value is used as the seed.
>
>    # The arguments for :op option procedure are the seed and the value.
>    # (i.e. the last element of the array returned from the block.)
>    r = [0].categorize(:seed =>  :s,
>                       :op =>  lambda {|x,y|
>                         p [x,y]               #=>  [:s, :v]
>                         1
>                       }) {|e|
>      p e #=>  0
>      [:k, :v]
>    }
>    p r #=>  {:k=>1}
>
>    # The arguments for :update option procedure are the seed and the array
>    # returned from the block.
>    r = [0].categorize(:seed =>  :s,
>                       :update =>  lambda {|x,y|
>                         p [x,y]               #=>  [:s, [:k, :v]]
>                         1
>                       }) {|e|
>      p e #=>  0
>      [:k, :v]
>    }
>    p r #=>  {:k=>1}
>
> The default behavior, array construction, can be implemented as follows.
>    :seed =>  nil
>    :op =>  lambda {|s, v| !s ? [v] : (s<<  v) }
>
> Note that matz doesn't find satisfact in the method name, "categorize".
> [ruby-dev:42681]
>
> Also note that matz wants another method than this method,
> which the hash value is the last value, not an array of all values.
> This can be implemented by enum.categorize(:op=>lambda {|x,y| y}) { ... }.
> But good method name is not found yet.
> [ruby-dev:42643]

-- 
#-# Martin J. Dst, Professor, Aoyama Gakuin University
#-# http://www.sw.it.aoyama.ac.jp   mailto:duerst@it.aoyama.ac.jp

In This Thread