Forum: Ruby Defining a default proc for Hash

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
1e736afdcdfe0753d67a81d449aca590?d=identicon&s=25 Srijayanth Sridhar (Guest)
on 2009-04-30 09:15
(Received via mailing list)
Hello,

Is there a way to redefine or newly define a default proc for Hash way
after
it has been constructed and populated with elements?

There seems to be a #default= but no #default_proc=

Thank you,

Jayanth
54404bcac0f45bf1c8e8b827cd9bb709?d=identicon&s=25 7stud -- (7stud)
on 2009-04-30 09:28
Srijayanth Sridhar wrote:
> Hello,
>
> Is there a way to redefine or newly define a default proc for Hash way
> after
> it has been constructed and populated with elements?
>
> There seems to be a #default= but no #default_proc=
>

Did you read this?

---------------------------------------------------------- Hash#default=
     hsh.default = obj     => hsh
------------------------------------------------------------------------
      ....

      It is not possible to set the a default to a
     +Proc+ that will be executed on each key lookup.

       ...

        # This doesn't do what you might hope...
        h.default = proc do |hash, key|
          hash[key] = key + key
        end
        h[2]       #=> #<Proc:0x401b3948@-:6>
        h["cat"]   #=> #<Proc:0x401b3948@-:6>
1e736afdcdfe0753d67a81d449aca590?d=identicon&s=25 Srijayanth Sridhar (Guest)
on 2009-04-30 09:39
(Received via mailing list)
Yes, I did. All that tells me is that it isn't possible to set a default
proc using default or any other calls. Which is why I asked, if there is
any
*other* way to do it. If not, it simply can't be done. Of course, it
would
also be nice if someone could explain the rationale for not wanting to
alter
the default proc once it has been defined.

Thank you,

Jayanth
666b4e17b4bb0e2d999037a25f65a7cb?d=identicon&s=25 Heesob Park (phasis)
on 2009-04-30 10:02
(Received via mailing list)
2009/4/30 Srijayanth Sridhar <srijayanth@gmail.com>:
> Yes, I did. All that tells me is that it isn't possible to set a default
> proc using default or any other calls. Which is why I asked, if there is any
> *other* way to do it. If not, it simply can't be done. Of course, it would
> also be nice if someone could explain the rationale for not wanting to alter
> the default proc once it has been defined.
>
You can do it like this:

class Hash
  def default_proc=(blk)
             self.replace(Hash.new(&blk).merge(self))
  end
end

h = {1=>2,3=>4}
p h.default_proc
h.default_proc = proc {|h,k| h[k]=3 }
p h.default_proc

Regards,

Park Heesob
1e736afdcdfe0753d67a81d449aca590?d=identicon&s=25 Srijayanth Sridhar (Guest)
on 2009-04-30 11:51
(Received via mailing list)
Thanks,

That's twice in two days that merge has come up wrt Hash.

Jayanth
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2009-04-30 13:21
(Received via mailing list)
2009/4/30 Srijayanth Sridhar <srijayanth@gmail.com>:
> Yes, I did. All that tells me is that it isn't possible to set a default
> proc using default or any other calls. Which is why I asked, if there is any
> *other* way to do it. If not, it simply can't be done. Of course, it would
> also be nice if someone could explain the rationale for not wanting to alter
> the default proc once it has been defined.

It's there - but not in 1.8.*:

13:14:34 JavaProducts_NGCP_dev_R1.0_PoA$ allruby -e 'puts
Hash.instance_methods.grep(/proc/)'
CYGWIN_NT-5.1 padrklemme1 1.5.25(0.156/4/2) 2008-06-12 19:34 i686 Cygwin
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]
default_proc
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-cygwin]
default_proc
default_proc=
13:14:51 JavaProducts_NGCP_dev_R1.0_PoA$

Kind regards

robert
This topic is locked and can not be replied to.