Question about Hash's initialize

I'd like to make a class that behave like a Hash but keeps keys in created
order.
Followings are some initial testing codes...

class OHash < Hash
  def self.(*args)
    if (args.size == 1) and args[0].kind_of?(Hash)
      args[0].each_key { |k| puts k}
    else
      args.each_index { |i| puts(a[i]) if (i % 2) == 0 }
    end
    super
  end

  def =(key, value)
    puts key
    super
  end
end

I'm going to replace puts call to assignment later, and would like to use
instead of Hash or even override default Hash's methods using alias.
Tests...

OHash['b'=>2, 'c'=>3, 'a'=>1, 'aa'=>11]

aa
a
b
c
=> {'aa'=>11, 'a'=>1, 'b'=>2, 'c'=>3}

OHash['b', 2, 'c', 3, 'a', 1, 'aa', 11]

b
c
a
aa

As the code says, argument to class method is a already Hash when we
initialize hash form.
Any comments, ideas and test results would be appreciated.

Suhku

I'd like to make a class that behave like a Hash but keeps keys in created
order.
Followings are some initial testing codes...

class OHash < Hash
  def self.(*args)
    if (args.size == 1) and args[0].kind_of?(Hash)
      args[0].each_key { |k| puts k}
    else
      args.each_index { |i| puts(a[i]) if (i % 2) == 0 }
    end
    super
  end

  def =(key, value)
    puts key
    super
  end
end

I'm going to replace puts call to assignment later, and would like to use
instead of Hash or even override default Hash's methods using alias.
Tests...

> OHash['b'=>2, 'c'=>3, 'a'=>1, 'aa'=>11]

AFAIK there is no way to get this ever to work as you expect since, as
you said, the arguments are transformed into a hash before the method
call.

Any comments, ideas and test results would be appreciated.

You're not the first one that desires such a beast. If you don't do it
for the fun of it, I'd just check the RAA - I'm sure there is already
a hash that maintains insertion order. Btw, why do you need that?

Kind regards

robert

···

2006/3/10, Suhku Huh <nineclue@gmail.com>:

--
Have a look: Robert K. | Flickr

my alib has an OrderHash class. anyone's welcome to it for the stealing.
it's on the raa and rubyforge.

regards.

-a

···

On Sat, 11 Mar 2006, Robert Klemme wrote:

2006/3/10, Suhku Huh <nineclue@gmail.com>:

I'd like to make a class that behave like a Hash but keeps keys in created
order.
Followings are some initial testing codes...

class OHash < Hash
  def self.(*args)
    if (args.size == 1) and args[0].kind_of?(Hash)
      args[0].each_key { |k| puts k}
    else
      args.each_index { |i| puts(a[i]) if (i % 2) == 0 }
    end
    super
  end

  def =(key, value)
    puts key
    super
  end
end

I'm going to replace puts call to assignment later, and would like to use
instead of Hash or even override default Hash's methods using alias.
Tests...

OHash['b'=>2, 'c'=>3, 'a'=>1, 'aa'=>11]

AFAIK there is no way to get this ever to work as you expect since, as
you said, the arguments are transformed into a hash before the method
call.

Any comments, ideas and test results would be appreciated.

You're not the first one that desires such a beast. If you don't do it
for the fun of it, I'd just check the RAA - I'm sure there is already
a hash that maintains insertion order. Btw, why do you need that?

Kind regards

robert

--
share your knowledge. it's a way to achieve immortality.
- h.h. the 14th dali lama

Thanks a lot for helpful comments. I'll check RAA including OrderHash.

Btw, why do you need that?

I would use it implementing some menu structure that varies with user.
May be Array.assoc / rassoc may be used instead but I think Has is more
appropriate if key order is maintained.

regards.