Issue #5662 has been updated by mame (Yusuke Endoh).

Status changed from Open to Rejected

I think the answer to this original proposal is "use each_with_object".
That's all.  Closing.

Please open another ticket for an alias of the method if needed.

-- 
Yusuke Endoh <mame / tsg.ne.jp>
----------------------------------------
Feature #5662: inject-accumulate, or Haskell's mapAccum*
https://bugs.ruby-lang.org/issues/5662#change-25267

Author: EdvardM (Edvard Majakari)
Status: Rejected
Priority: Normal
Assignee: 
Category: 
Target version: 


with Ruby, we often use this idiom to build a hash out of something:

new_hash = enum.inject({}) { |h, thing| h[compute_key(thing) = compute_value(thing)]; h }

while that last h is very easy to add, it is also easy to forget and feels logically not very injectish thing to do. I'd propose this we call 'infuse' in our project:

module Enumerable
  # like inject, but returns accumulator instead. Instead of writing
  #   [1, 2].inject({}) {|h, i| h[i] = 2*i; h }
  # just say
  #   [1, 2].infuse({}) {|h, i| h[i] = 2*i } # -> {1 => 2, 2 => 4}
  def infuse(init, &block)
    inject(init) { |acc, i| block.call(acc, i); acc }
  end
end

Eg. [1, 2].infuse({}) { |a, i| a[i] = 2*i } #  => {1 => 2, 2 => 4}

Instead of infuse, maybe inject_accum or inject_acc would be more rubyish method name.


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