B

Dear all
Please contribute in enhancing the functionality of my website -

let me know.

2010/2/28 Glenn Ritz said:
Robert said:
2010/2/24 Xavier Noria <[email protected]>:

{'en' =3D> {'A' =3D> Fixnum, 'B' =3D> {'C' =3D> Fixnum, 'D' =3D> Stri= ng }}
=EF=BF=BD =EF=BF=BDnewh[k] =3D v.is_a?(Hash) ? classify_values(v) : v.= class
=EF=BF=BDend
=EF=BF=BDnewh
end

p classify_values({'en' =3D> {'A' =3D> 1, 'B' =3D> {'C' =3D> 3, 'D' = =3D> 'four'
}}})

I would do it a tad differently:

def classify(o)
case o
when Hash
h =3D {}
o.each {|k,v| h[k] =3D classify(v)}
h
else
o.class
end
end

Advantage is that you can stuff anything in the method while your
variant requires the argument to be a Hash. The difference may seem
subtle but if you add more collection types for special treatment,
you'll will notice a difference in effort to implement it. I can
simply do

def classify(o)
case o
when Hash
h =3D {}
o.each {|k,v| h[k] =3D classify(v)}
h
when Array
o.map {|v| classify(v)}
else
o.class
end
end

while you need to do a more complicated code change.

Kind regards

robert

I am trying to adapt this a bit, but with no luck so far.

What I'd like to do is to start with a hash and have the above code be

In other words, if I have the following code:

h0 =3D {}
h1 =3D {'en' =3D> {'A' =3D> 5, 'B' =3D> { 'C' =3D> 'xxx', 'D' =3D> { 'E'= =3D> 4 }}}}
h2 =3D {'en' =3D> {'F' =3D> 'yyy'}}

I'd like to be able to call the classify method like this:

puts h0.classify(h1).classify(h2).inspect

And get the following result:

{'en' =3D> {'A' =3D> Fixnum, 'B' =3D> { 'C' =3D> String, 'D' =3D> { 'E' = =3D> Fixnum
}}, 'F' =3D> String }}

So I figured it would be something like this:

class Hash
def classify(o)
case o
when Hash
h =3D self
o.each {|k,v| h[k] =3D classify(v)}
h
when Array
o.map {|v| classify(v)}
else
o.class
end
end
end

But this is probably wrong in a few ways. Any suggestions would be
appreciated.

I would separate this in two steps:

1. merge Hashes intelligently (i.e. with a bit more logic than
Hash#merge default behavior).

2. classify.

So this would probably be something like

class Hash
def merge_deep!(hs)
merge! hs do |key,old_val,new_val|
case old_val
when Hash
old_val.merge_deep! new_val
else
new_val
end
end
end
end

see
http://www.ruby-doc.org/ruby-1.9/classes/Hash.html#M000406

Kind regards

robert

--=20
With Regards,