[#47790] [ruby-trunk - Bug #7097][Open] Thread locals don't work inside Enumerator — "tenderlovemaking (Aaron Patterson)" <aaron@...>

32 messages 2012/10/01
[#47791] [ruby-trunk - Bug #7097][Assigned] Thread locals don't work inside Enumerator — "kosaki (Motohiro KOSAKI)" <kosaki.motohiro@...> 2012/10/01

[#47792] Re: [ruby-trunk - Bug #7097][Assigned] Thread locals don't work inside Enumerator — Aaron Patterson <tenderlove@...> 2012/10/01

On Tue, Oct 02, 2012 at 03:05:17AM +0900, kosaki (Motohiro KOSAKI) wrote:

[#47798] Re: [ruby-trunk - Bug #7097][Assigned] Thread locals don't work inside Enumerator — SASADA Koichi <ko1@...> 2012/10/01

(2012/10/02 3:12), Aaron Patterson wrote:

[#47800] Re: [ruby-trunk - Bug #7097][Assigned] Thread locals don't work inside Enumerator — SASADA Koichi <ko1@...> 2012/10/01

(2012/10/02 8:22), SASADA Koichi wrote:

[#47832] [ruby-trunk - Feature #7106][Open] FileUtils.touch should allow touching the symlink itself rather than the file the link points to — "cirrusthinking (Alessandro Diaferia)" <alessandro@...>

18 messages 2012/10/04

[#47847] [ruby-trunk - Bug #7110][Open] CGI: Add support for HTML5 <header> tag — "stomar (Marcus Stollsteimer)" <redmine@...>

16 messages 2012/10/05

[#47870] [ruby-trunk - Bug #7123][Open] Segmentation fault in ruby 1.9.3-p194 — "mscottford (M. Scott Ford)" <scott@...>

13 messages 2012/10/09

[#47880] [ruby-trunk - Bug #7134][Open] Signal handling bug in Mac OS X — "auastro (Andy Kitchen)" <kitchen.andy+rubybug@...>

17 messages 2012/10/10

[#47881] [ruby-trunk - Bug #7135][Open] GC bug in Ruby 1.9.3-p194? — "alexdowad (Alex Dowad)" <alexinbeijing@...>

21 messages 2012/10/10

[#47887] [ruby-trunk - Bug #7137][Open] Date.parse overly lenient when attempting to parse Monday? — "garysweaver (Gary Weaver)" <garysweaver@...>

12 messages 2012/10/10

[#47930] [ruby-trunk - Feature #7148][Open] Improved Tempfile w/o DelegateClass — "Glass_saga (Masaki Matsushita)" <glass.saga@...>

14 messages 2012/10/12

[#47970] [ruby-trunk - Bug #7158][Open] require is slow in its bookkeeping; can make Rails startup 2.2x faster — "gregprice (Greg Price)" <price@...>

30 messages 2012/10/14

[#48027] [Backport93 - Backport #7172][Open] [[Ruby 1.9:]] fix rbconfig for --enable-load-relative (v2) — "mpapis (Michal Papis)" <mpapis@...>

13 messages 2012/10/16

[#48053] [ruby-trunk - Bug #7180][Open] set_trace_func with error in proc block locks up Ruby with 100% cpu usage and no way to exit without killing proc — "garysweaver (Gary Weaver)" <garysweaver@...>

8 messages 2012/10/17

[#48072] [ruby-trunk - Bug #7184][Open] --disable-gems commandline parameter does not show up with ruby -h — "steenslag (siep korteling)" <s.korteling@...>

10 messages 2012/10/18

[#48130] [ruby-trunk - Bug #7200][Open] Setting external encoding with BOM| — "brixen (Brian Ford)" <brixen@...>

14 messages 2012/10/21

[#48191] [ANN] 2.0.0 feature freeze — Yusuke Endoh <mame@...>

Japanese later; 日本語は後で

37 messages 2012/10/24
[#48696] Re: [ANN] 2.0.0 feature freeze — SASADA Koichi <ko1@...> 2012/11/01

(2012/10/24 5:39), Yusuke Endoh wrote:

[#48260] [ruby-trunk - Bug #7214][Open] Ruby 2.0 breaks support for some debugging tools — "banister (john mair)" <jrmair@...>

22 messages 2012/10/25

[#48315] [ruby-trunk - Bug #7220][Open] StringIO#initialize_copy causes aliasing between the objects — "brixen (Brian Ford)" <brixen@...>

13 messages 2012/10/26

[#48413] [ruby-trunk - Bug #7221][Open] Unable to compile kgio under 1.9.3 with error: ruby-1.9.3-<plvl>/lib/ruby/1.9.1/mkmf.rb:597:in `Integer': can't convert nil into Integer (TypeError) — "davidderyldowney (David Deryl Downey)" <me@...>

9 messages 2012/10/27

[#48549] [ruby-trunk - Feature #7240][Open] Inheritable #included/#extended Hooks For Modules — "apotonick (Nick Sutterer)" <apotonick@...>

14 messages 2012/10/29

[#48551] [ruby-trunk - Feature #7241][Open] Enumerable#to_h proposal — "nathan.f77 (Nathan Broadbent)" <nathan.f77@...>

23 messages 2012/10/29

[#48552] [ruby-trunk - Bug #7242][Open] Bignum mathematical accuracy regression in r31695 — "mhall (Matthew Hall)" <mhall@...>

11 messages 2012/10/29

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

From: "yhara (Yutaka HARA)" <redmine@...>
Date: 2012-10-27 15:17:55 UTC
List: ruby-core #48489
Issue #6687 has been updated by yhara (Yutaka HARA).

Category set to core
Target version set to next minor


----------------------------------------
Feature #6687: Enumerable#with
https://bugs.ruby-lang.org/issues/6687#change-31820

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


=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