Feature #1880

Hash#flatten Doesn't Operate Recursively for Hash Values

Added by Run Paint Run Run about 6 years ago. Updated over 3 years ago.

[ruby-core:24745]
Status:Rejected
Priority:Normal
Assignee:Yukihiro Matsumoto

Description

=begin
Hash#flatten claims to flatten recursively if given an argument specifying the depth. This works as expected for Array values, but has no bearing on Hash values.

h = {orange: :orange, coconut: {inside: :white, outside: :brown}, grapes: {colour: [:red, :green]}}
h.flatten
=> [:orange, :orange, :coconut, {:inside=>:white, :outside=>:brown}, :grapes, {:colour=>[:red, :green]}]
h.flatten(20)
=> [:orange, :orange, :coconut, {:inside=>:white, :outside=>:brown}, :grapes, {:colour=>[:red, :green]}]

This seems peculiar. If the user has specified a depth he's explicitly stating the level of recursion to flatten; not how he wants Array values to be treated. IOW, I expected #flatten(depth) to call #flatten on Hash values as appropriate. This can be generalised to: call #flatten on values until the depth has been reached.
=end

History

#1 Updated by Marc-Andre Lafortune almost 6 years ago

  • Assignee set to Yukihiro Matsumoto
  • Priority changed from 3 to Normal
  • Target version set to 1.9.2

=begin
Moving this from 'bug' to 'feature request' as behavior corresponds to doc. Currently it converts to an array and (if given an argument) calls flatten on it. Array#flatten leaves hashes alone.

The question remaining: should there be a way to recursively flatten hashes, via Hash#flatten or otherwise?
=end

#2 Updated by Yusuke Endoh over 5 years ago

=begin
Hi,

Hash#flatten claims to flatten recursively if given an argument specifying the depth. This works as expected for Array values, but has no bearing on Hash values.

I wonder why recursive Hash#flatten is needed :-)
I can't imagine any use case.

--
Yusuke Endoh mame@tsg.ne.jp
=end

#3 Updated by Kazuhiro NISHIYAMA over 5 years ago

  • Target version changed from 1.9.2 to 2.0.0

=begin

=end

#4 Updated by Shyouhei Urabe almost 5 years ago

  • Status changed from Open to Assigned

=begin

=end

#5 Updated by Yusuke Endoh over 3 years ago

  • Status changed from Assigned to Rejected

I'm rejecting this feature ticket because no progress has been
made for a long time. See .

I think flatten means an operation on Array, in Ruby.
"flatten" on Hash is also possible, but Hash#flatten is not for
that. I think we need:

  • a use case
  • another appropriate name
  • detailed semantics (what does {a: {a: 1}}.flatten return?)

Yusuke Endoh mame@tsg.ne.jp

Also available in: Atom PDF