a=Hash.new{|h,k|
h[k]={}
}
p a[1]=1
a[2][1]=2
#a[2][2][3]=4
p a
···
--
Posted via http://www.ruby-forum.com/.
a=Hash.new{|h,k|
h[k]={}
}
p a[1]=1
a[2][1]=2
#a[2][2][3]=4
p a
--
Posted via http://www.ruby-forum.com/.
I know this can work,but I think it is suck
a=Hash.new{|h,k|
h[k]=Hash.new{|h,k|h[k]=Hash.new{|h,k|h[k]={}}}
}
p a[1]=1
a[2][1]=2
a[2][2][3]=4
a[3][1][1][1]=1
p a
--
Posted via http://www.ruby-forum.com/.
gz zz wrote:
a=Hash.new{|h,k|
h[k]={}
}p a[1]=1
a[2][1]=2
#a[2][2][3]=4
p a
Sure. Use Perl.
Oops, sorry. I forgot, datastructure autovivification is wrong,
variables springing into life (or maybe not, read the rest of the method
to find out) inadvertently are good.
Jenda
--
Posted via http://www.ruby-forum.com/\.
a = {}
==>{}
a[1] = 1
==>1
a[ [2,1] ] = 2
==>2
a[ [2,2,3] ] = 4
==>4
p a
{[2, 2, 3]=>4, [2, 1]=>2, 1=>1}
==>nil
On Jun 12, 1:29 am, gz zz <gpyg...@126.com> wrote:
a=Hash.new{|h,k|
h[k]={}}
p a[1]=1
a[2][1]=2
#a[2][2][3]=4
I know this can work,but I think it is suck
a=Hash.new{|h,k|
h[k]=Hash.new{|h,k|h[k]=Hash.new{|h,k|h[k]={}}}
}p a[1]=1
a[2][1]=2
a[2][2][3]=4
a[3][1][1][1]=1
p a
build_hash = proc {|h,k|h[k] = Hash.new &build_hash }
a = Hash.new &build_hash
def recursive_hash
Hash.new { |h, k| h[k] = recursive_hash }
end
a = recursive_hash
Or even
class Hash
def self.recursive
new { |h, k| h[k] = recursive }
end
end
which gives
a = Hash.recursive
=>
a[1][2][3][4] = 1
=> 1
puts a.inspect
{1=>{2=>{3=>{4=>1}}}}
--
Sylvain Joyeux
In addition to what's already been posted, there's this, which doesn't
require any extra variables or methods:
a = Hash.new{|h,k| h[k]=Hash.new &h.default_proc}
gz zz <gpygood@126.com> writes:
a[2][1]=2
a[2][2][3]=4
a[3][1][1][1]=1
p a
irb(main):001:0> a = Hash.new{|h,k| h[k]=Hash.new &h.default_proc}
=> {}
irb(main):002:0> a[2][1]=2
=> 2
irb(main):003:0> a[2][2][3]=4
=> 4
irb(main):004:0> a[3][1][1][1]=1
=> 1
irb(main):005:0> p a
{2=>{1=>2, 2=>{3=>4}}, 3=>{1=>{1=>{1=>1}}}}
=> nil
--
s=%q( Daniel Martin -- martin@snowplow.org
puts "s=%q(#{s})",s.to_a.last )
puts "s=%q(#{s})",s.to_a.last
That's okay, it happens to the best of us.
martin
On 6/12/07, Jenda Krynicky <jenda@cpan.org> wrote:
Sure. Use Perl.
Oops, sorry. I forgot, datastructure autovivification is wrong,
variables springing into life (or maybe not, read the rest of the method
to find out) inadvertently are good.
Sure. Use Perl.
What's the ruby-way of such things?
e.g.:
int[eth0][ip] = "10.0.0.1"
int[eth0][mask] = "255.255.255.0"
int[eth0][cidr] = "24"
int[eth1][ip] = "10.0.1.1"
int[eth1][mask] = "255.255.255.0"
int[eth1][cidr] = "24"
.
.
.
I like it if I have all these informations handy within one hash. But
even for me as a realy ruby-newby this looks much more like perl than
ruby.
It would be great to hear your thoughts how this would be done "the ruby
way"...
clean and elegant
--fsormok
--
Posted via http://www.ruby-forum.com/\.
a = Hash.new{|h,k| h[k]=Hash.new &h.default_proc}
irb(main):026:0> require 'ostruct'
irb(main):027:0> int = Hash.new{|h,k| h[k]=OpenStruct.new}
a = {}
==>{}
a[1] = 1
==>1
a[ [2,1] ] = 2
==>2
a[ [2,2,3] ] = 4
==>4
p a
{[2, 2, 3]=>4, [2, 1]=>2, 1=>1}
==>nil
Tanks for the replies.
I'm just a little bit confused because in ruby everything is lean and
clean but when it comes to hashes of hashes it gets kind of complicated.
For me it looks like ruby has another "concept" of solving such things.
-fsormok
--
Posted via http://www.ruby-forum.com/\.
Thanks for this - I didn't know about the default_proc method. Quite
elegant in this case.
On Jun 12, 6:21 am, Daniel Martin <mar...@snowplow.org> wrote:
In addition to what's already been posted, there's this, which doesn't
require any extra variables or methods:a = Hash.new{|h,k| h[k]=Hash.new &h.default_proc}
Sure. Use Perl.
What's the ruby-way of such things?
e.g.:
int[eth0][ip] = "10.0.0.1"
int[eth0][mask] = "255.255.255.0"
int[eth0][cidr] = "24"
int[eth1][ip] = "10.0.1.1"
int[eth1][mask] = "255.255.255.0"
int[eth1][cidr] = "24"
.I like it if I have all these informations handy within one hash. But
even for me as a realy ruby-newby this looks much more like perl than
ruby.It would be great to hear your thoughts how this would be done "the ruby
way"...clean and elegant
You can do that in Ruby, if you want to.
See: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/255313
irb(main):011:0> int = Hash.new{|h,k| h[k]=Hash.new &h.default_proc}
=> {}
irb(main):012:0> int[:eth0][:ip] = "10.0.0.1"
irb(main):013:0> int[:eth0][:mask] = "255.255.255.0"
irb(main):014:0> int[:eth0][:cidr] = "24"
irb(main):015:0> int[:eth1][:ip] = "10.0.1.1"
irb(main):016:0> int[:eth1][:mask] = "255.255.255.0"
irb(main):017:0> int[:eth1][:cidr] = "24"
irb(main):018:0> int
=> {:eth0=>{:ip=>"10.0.0.1", :mask=>"255.255.255.0", :cidr=>"24"}, :eth1=>{:ip=>"10.0.1.1", :mask=>"255.255.255.0", :cidr=>"24"}}
Another possibility might be OpenStruct.
irb(main):026:0> require 'ostruct'
=> true
irb(main):027:0> int = Hash.new{|h,k| h[k]=OpenStruct.new}
=> {}
irb(main):028:0> int[:eth0].ip = "10.0.0.1"
irb(main):029:0> int[:eth0].mask = "255.255.255.0"
irb(main):030:0> int[:eth0].cidr = "24"
irb(main):031:0> int[:eth1].ip = "10.0.1.1"
irb(main):032:0> int[:eth1].mask = "255.255.255.0"
irb(main):033:0> int[:eth1].cidr = "24"
irb(main):034:0> int
=> {:eth0=>#<OpenStruct ip="10.0.0.1", mask="255.255.255.0", cidr="24">, :eth1=>#<OpenStruct ip="10.0.1.1", mask="255.255.255.0", cidr="24">}
Regards,
Bill
From: "Fsormok Fsormok" <fsormok@inbox.ru>
Hmm the context of this statement seems not complete in *this* thread,
maybe you could elaborate on this a little bit?
Personally I feel that Ruby's concept of Hashes is clearcut and
exactly the same as in most of its relatives (Perl,Python...).
What exactly would you like to have "simpler"?
Cheers
Robert
On 7/23/07, Fsormok Fsormok <fsormok@inbox.ru> wrote:
> a = Hash.new{|h,k| h[k]=Hash.new &h.default_proc}
> irb(main):026:0> require 'ostruct'
> irb(main):027:0> int = Hash.new{|h,k| h[k]=OpenStruct.new}>a = {}
> ==>{}
>a[1] = 1
> ==>1
>a[ [2,1] ] = 2
> ==>2
>a[ [2,2,3] ] = 4
> ==>4
>p a
>{[2, 2, 3]=>4, [2, 1]=>2, 1=>1}
> ==>nilTanks for the replies.
I'm just a little bit confused because in ruby everything is lean and
clean but when it comes to hashes of hashes it gets kind of complicated.
For me it looks like ruby has another "concept" of solving such things.
--
As simple as possible,
but not simpler.
-- A. Einstein
In my personal opinion, multilevel hashes aren't clean and elegant in
any language. I'd try to make an object out of it:
class Interface
attr_accessor :name, :ip, :mask, :cidr
end
i = Interface.new
i.name = "eth0"
i.ip = "10.0.0.1"
i.mask = "255.255.255.0"
i.cidr = 24
- Mark.
On Jul 20, 1:57 pm, Fsormok Fsormok <fsor...@inbox.ru> wrote:
> Sure. Use Perl.
What's the ruby-way of such things?
e.g.:
int[eth0][ip] = "10.0.0.1"
int[eth0][mask] = "255.255.255.0"
int[eth0][cidr] = "24"
int[eth1][ip] = "10.0.1.1"
int[eth1][mask] = "255.255.255.0"
int[eth1][cidr] = "24"
.
.
.I like it if I have all these informations handy within one hash. But
even for me as a realy ruby-newby this looks much more like perl than
ruby.It would be great to hear your thoughts how this would be done "the ruby
way"...clean and elegant
> a = Hash.new{|h,k| h[k]=Hash.new &h.default_proc}
> irb(main):026:0> require 'ostruct'
> irb(main):027:0> int = Hash.new{|h,k| h[k]=OpenStruct.new}>a = {}
> ==>{}
>a[1] = 1
> ==>1
>a[ [2,1] ] = 2
> ==>2
>a[ [2,2,3] ] = 4
> ==>4
>p a
>{[2, 2, 3]=>4, [2, 1]=>2, 1=>1}
> ==>nilTanks for the replies.
I'm just a little bit confused because in ruby everything is lean and
clean but when it comes to hashes of hashes it gets kind of complicated.
For me it looks like ruby has another "concept" of solving such things.
Its this what you are looking for?
$ ruby <<XXX
miss = lambda {|h,k| h[k] = Hash.new(&miss)}
hash = Hash.new(&miss)
hash[1][2]=3
hash[4]=5
p hash
XXX
{1=>{2=>3}, 4=>5}
Kind regards
robert
2007/7/23, Fsormok Fsormok <fsormok@inbox.ru>:
Daniel Martin wrote:
In addition to what's already been posted, there's this, which doesn't
require any extra variables or methods:a = Hash.new{|h,k| h[k]=Hash.new &h.default_proc}
That's clever, but I think the way it automatically creates keys is
wrong. You need to be able to check to see if a key exists without
polluting the hash with a bunch of empties.
Hence my new gem:
http://github.com/dasil003/safe-nested-hash
--
Posted via http://www.ruby-forum.com/\.
Thanx Mark
This is exactly what i liked to hear
In my personal opinion, multilevel hashes aren't clean and elegant in
any language.
HoH are quiet common in perl (at least I use them alot), not in Ruby
IMHO.
But as always: TMTOWTDI
I'd try to make an object out of it:
class Interface
attr_accessor :name, :ip, :mask, :cidr
endi = Interface.new
i.name = "eth0"
i.ip = "10.0.0.1"
i.mask = "255.255.255.0"
i.cidr = 24- Mark.
--
Posted via http://www.ruby-forum.com/\.