[#46105] [ruby-trunk - Feature #6687][Open] Enumerable#with — "merborne (kyo endo)" <redmine@...>

14 messages 2012/07/02

[#46133] [ruby-trunk - Feature #6688][Open] Object#replace — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

24 messages 2012/07/03

[#46160] [ruby-trunk - Feature #6693][Open] Don't warn for unused variables starting with _ — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>

15 messages 2012/07/04

[#46200] [ruby-trunk - Bug #6702][Open] Date should be either required or not — "rosenfeld (Rodrigo Rosenfeld Rosas)" <rr.rosas@...>

14 messages 2012/07/05

[#46296] [ruby-trunk - Feature #6717][Open] Method like #instance_eval that returns self (like #tap) — "alexeymuranov (Alexey Muranov)" <redmine@...>

10 messages 2012/07/10

[#46320] [ruby-trunk - Feature #6721][Open] Object#yield_self — "alexeymuranov (Alexey Muranov)" <redmine@...>

25 messages 2012/07/11

[#46339] [ruby-trunk - Bug #6724][Open] waaaaaaant! ( — "zenspider (Ryan Davis)" <redmine@...>

11 messages 2012/07/11

[#46377] [ruby-trunk - Feature #6727][Open] Add Array#rest (with implementation) — "duckinator (Nick Markwell)" <nick@...>

25 messages 2012/07/13

[#46492] [ruby-trunk - Feature #6737][Open] Add Hash#read and alias as #[]. — "trans (Thomas Sawyer)" <transfire@...>

12 messages 2012/07/15

[#46500] [ruby-trunk - Feature #6739][Open] One-line rescue statement should support specifying an exception class — Quintus (Marvin Gülker) <sutniuq@...>

22 messages 2012/07/15

[#46562] [ruby-trunk - Feature #6758][Open] Object#sequence — "merborne (kyo endo)" <redmine@...>

19 messages 2012/07/20

[#46574] [ruby-trunk - Feature #6762][Open] Control interrupt timing — "ko1 (Koichi Sasada)" <redmine@...>

39 messages 2012/07/20

[#46641] [ruby-trunk - Bug #6780][Open] cannot compile zlib module, when cross-compiling. — "jinleileiking (lei king)" <jinleileiking@...>

14 messages 2012/07/23

[#46659] [ruby-trunk - Bug #6783][Open] Infinite loop in inspect, not overriding inspect, to_s, and no known circular references. Stepping into inspect in debugger locks it up with 100% CPU. — "garysweaver (Gary Weaver)" <garysweaver@...>

8 messages 2012/07/23

[#46792] [ruby-trunk - Bug #6799][Open] Digest::*.hexdigest returns an ASCII-8BIT String — "Eregon (Benoit Daloze)" <redmine@...>

11 messages 2012/07/26

[#46799] [ruby-trunk - Feature #6801][Open] String#~ for a here document — "merborne (kyo endo)" <redmine@...>

12 messages 2012/07/27

[#46829] [ruby-trunk - Feature #6806][Open] Support functional programming: forbid instance/class variables for ModuleName::method_name, allow for ModuleName.method_name — "alexeymuranov (Alexey Muranov)" <redmine@...>

7 messages 2012/07/28

[#46832] [ruby-trunk - Bug #6807][Open] Can't compile ruby without ruby — "devcurmudgeon (Paul Sherwood)" <storitel@...>

13 messages 2012/07/28

[#46834] [ruby-trunk - Feature #6808][Open] Implicit index for enumerations — "trans (Thomas Sawyer)" <transfire@...>

15 messages 2012/07/28

[#46838] [ruby-trunk - Bug #6810][Open] `module A::B; end` is not equivalent to `module A; module B; end; end` with respect to constant lookup (scope) — "alexeymuranov (Alexey Muranov)" <redmine@...>

17 messages 2012/07/28

[#46896] (Half-baked DRAFT) new `require' framework — SASADA Koichi <ko1@...>

Hi,

22 messages 2012/07/31

[ruby-core:46165] [ruby-trunk - Feature #6687] Enumerable#with

From: "knu (Akinori MUSHA)" <knu@...>
Date: 2012-07-04 05:50:22 UTC
List: ruby-core #46165
Issue #6687 has been updated by knu (Akinori MUSHA).


> Also, a word `each` in `each_with_object` is not essential, then omittable in view of the fact that it is called to Enumerable object.

I doubt it.  Enumerable is often just one probably minor aspect of an including class, and even when used with an array or hash it is not obvious from the name with or with_object that it would iterate over the contents.  I'd say it's too bold.

However, just as Eregon says, I wouldn't deny it would make sense to alias Enumerable::Enumerator#with() to with_object() because polluting the name space limited to Enumerator would only do little harm.

P.S.
You may want to search for a past discussion:
http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-core/17084?16896-17624
----------------------------------------
Feature #6687: Enumerable#with
https://bugs.ruby-lang.org/issues/6687#change-27785

Author: merborne (kyo endo)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 


=begin
Let me propose `Enumerable#with` for an alias of `Enumerable#each_with_object` or replace of it.

`Enumerable#each_with_object`のエイリアス、またはその置き換えとして、`Enumerable#with`を提案します。

##Reason

##理由

When you create a hash using `Enumerable#inject`, you should ensure that the block return the hash.

`Enumerable#inject`を使ってハッシュを生成するときには、ブロックの返り値としてハッシュが返ることを保証する必要があります。

    words.inject(Hash.new(0)) { |h, word| h[word] += 1; h } # => {"You"=>3, "say"=>10, "Yes"=>1, "I"=>7, "No"=>1, "Stop"=>1, "and"=>2, "Go"=>1, "go"=>2, "Oh"=>1, "no"=>1, "Goodbye"=>2, "Hello"=>2, "hello"=>5, "don"=>2, "t"=>2, "know"=>2, "why"=>2, "you"=>2, "goodbye"=>1}

Many rubyists, however, hate this, and there are many discussions for it.

しかし、これを嫌うRubyistは多く、ネット上でその改善についての議論をしばしば見掛けます。

    Feature #5662: inject-accumulate, or Haskell's mapAccum* - ruby-trunk - Ruby Issue Tracking System http://bugs.ruby-lang.org/issues/5662
    
    Ruby inject with intial being a hash - Stack Overflow http://stackoverflow.com/questions/9434162/ruby-inject-with-intial-being-a-hash

`Enumerable#each_with_object` is often presented for one of the best solutions for it.

そしてその有力な解決策として、Enumerable#each_with_objectが提示されてきました。

    words.each_with_object(Hash.new(0)) { |word, h| h[word] += 1 } # => {"You"=>3, "say"=>10, "Yes"=>1, "I"=>7, "No"=>1, "Stop"=>1, "and"=>2, "Go"=>1, "go"=>2, "Oh"=>1, "no"=>1, "Goodbye"=>2, "Hello"=>2, "hello"=>5, "don"=>2, "t"=>2, "know"=>2, "why"=>2, "you"=>2, "goodbye"=>1}

However, `each_with_object` is still unfamiliar and then not used frequently. The biggest reason, I think, is its lengthy name.

しかし、その有用性にも拘らず、依然としてeach_with_objectの知名度および利用頻度は低いと思われます。そして、その原因は、その名前の長さにあると考えます。

`each_with_object` is the 39th longest-name method among 754 at Ruby 1.9.3, based on following calculation;

以下の演算により、Ruby1.9.3の環境下でeach_with_objectは、754件中39番目に長い名前のメソッドであることが分かりました。

    methods = Module.constants.flat_map do |c|
      next [] if c == :Gem
      k = Module.const_get(c)
      k.methods(false) + k.instance_methods(false) rescue []
    end.uniq.reject { |m| "#{m}".start_with? '_deprecated' }.sort_by { |m| -m.size }
    
    methods.size # => 754
    methods.index(:each_with_object) # => 39
    
    puts methods.take(100).group_by(&:size).to_a

The output is here.

出力です。

    26
    protected_instance_methods
    instance_variable_defined?
    25
    protected_method_defined?
    24
    private_instance_methods
    23
    class_variable_defined?
    public_instance_methods
    define_singleton_method
    private_method_defined?
    22
    singleton_method_added
    public_instance_method
    public_method_defined?
    21
    instance_variable_get
    instance_variable_set
    remove_class_variable
    20
    private_class_method
    repeated_combination
    repeated_permutation
    compare_by_identity?
    19
    respond_to_missing?
    abort_on_exception=
    public_class_method
    compare_by_identity
    18
    undefine_finalizer
    instance_variables
    abort_on_exception
    class_variable_get
    class_variable_set
    relative_path_from
    17
    internal_encoding
    external_encoding
    default_internal=
    default_external=
    protected_methods
    singleton_methods
    ascii_compatible?
    16
    global_variables
    executable_real?
    initialize_clone
    each_with_object   # <= Here!
    require_relative
    private_constant
    default_external
    included_modules
    instance_methods
    define_finalizer
    default_internal
    15
    private_methods
    fixed_encoding?
    class_variables
    instance_method
    each_with_index
    public_constant
    garbage_collect
    source_location
    valid_encoding?
    singleton_class
    world_writable?
    local_variables
    world_readable?
    method_defined?
    14
    readable_real?
    locale_charmap
    const_defined?
    collect_concat
    initialize_dup
    add_trace_func
    close_on_exec=
    close_on_exec?
    named_captures
    set_trace_func
    write_nonblock
    writable_real?
    each_codepoint
    force_encoding
    public_methods
    13
    const_missing
    each_filename
    default_proc=
    set_backtrace
    public_method
    read_nonblock
    instance_exec
    absolute_path
    count_objects
    instance_eval
    12
    marshal_load
    reverse_each
    exclude_end?
    instance_of?
    make_symlink
    set_encoding
    block_given?
    default_proc
    slice_before
    marshal_dump
    11
    rationalize
    realdirpath
    each_object
    expand_path
    with_object

This result shows that methods which has 15+ name length is mostly for reflection or for special purpose. `each_with_object` is a general purpose method, the name should be shorter. 

このリストから分かることは、長さ15を超えるメソッドはその大半がリフレクション用か特殊目的用のものであるという事実です。each_with_objectはより汎用的なメソッドですから、その名前はもっと短くあるべきと考えます。現状の長さは、そのメソッドを無きものにしています。

I propose Enumerable#with for it. a word `object` in `each_with_object` is obvious and not necessary to spcify the purpose, because all data in Ruby is `object`. Also, a word `each` in `each_with_object` is not essential, then omittable in view of the fact that it is called to Enumerable object. I think that a word `with` still works for describing the same of `each_with_object`.

そこでEnumerable#withを提案します。まず、Rubyで扱われるデータはすべてオブジェクトですから、each_with_objectにおけるobjectは自明であり不要と考えます。次に、Enumerableオブジェクトに対するメソッド呼び出しという点から見て、eachも必須のものとは言えず、削除可能と考えます。そして残ったwithで十分にその目的、つまりEnumerableな要素を任意のオブジェクトと共に操作する、を意図できていると考えます。

Lastly, following is examples with `Enumerable#with`

最後に、`Enumerable#with`を使った例を示します。

    Enumerable.send(:alias_method, :with, :each_with_object)

    words.with(Hash.new(0)) { | word, h| h[word] += 1 } # => {"You"=>3, "say"=>10, "Yes"=>1, "I"=>7, "No"=>1, "Stop"=>1, "and"=>2, "Go"=>1, "go"=>2, "Oh"=>1, "no"=>1, "Goodbye"=>2, "Hello"=>2, "hello"=>5, "don"=>2, "t"=>2, "know"=>2, "why"=>2, "you"=>2, "goodbye"=>1}

    [*1..10].with(5).map(&:*) # => [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
    
    ['ruby', 'python', 'haskell'].with('ist').map(&:+) # => ["rubyist", "pythonist", "haskellist"]


Thank you for your consideration.

ご検討の程よろしくお願い致します。

=end



-- 
http://bugs.ruby-lang.org/

In This Thread