Feature #1880

Hash#flatten Doesn't Operate Recursively for Hash Values

Added by runpaint (Run Paint Run Run) almost 3 years ago. Updated 3 months ago.

[ruby-core:24745]
Status:Rejected Start date:08/05/2009
Priority:Normal Due date:
Assignee:matz (Yukihiro Matsumoto) % Done:

0%

Category:core
Target version:2.0.0

Description

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.

History

Updated by marcandre (Marc-Andre Lafortune) over 2 years ago

  • Assignee set to matz (Yukihiro Matsumoto)
  • Priority changed from Low to Normal
  • Target version set to 1.9.2
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?

Updated by mame (Yusuke Endoh) about 2 years ago

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>

Updated by znz (Kazuhiro NISHIYAMA) about 2 years ago

  • Target version changed from 1.9.2 to 2.0.0

Updated by shyouhei (Shyouhei Urabe) over 1 year ago

  • Status changed from Open to Assigned

Updated by mame (Yusuke Endoh) 3 months ago

  • Status changed from Assigned to Rejected
I'm rejecting this feature ticket because no progress has been made for a long time. See [ruby-core:42391]. 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