[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re-binding Proc

Gavin Kistner

9/1/2006 6:19:00 PM

Is there a way to call a proc while passing in the binding/scope for
'self'? I found an un-responded-to question on this (ruby-talk:12794)
in 2001 which implies that, at least then, there was no way to do it.

What I'm doing:
class Foo
@@handlers = {}

def self.handle_type( type, &proc )
@@handlers[ type ] = proc
end

attr_reader :name
def initialize( name )
@name = name
end

def do_thing( type )
@@handlers[ type ].call( self )
end
end

Foo.handle_type( :showname ){ |me|
puts "My name is '#{me.name}'"
}

f = Foo.new( 'f' )
f.do_thing( :showname )
#=> My name is 'f'


What I'd like to do instead:

Foo.handle_type( :showname ){
puts "My name is '#{self.name}'"
}

2 Answers

Gavin Kistner

9/1/2006 6:26:00 PM

0

Damn, hit send too soon. **continues**

I realize that I can do this by defining a method (as below), but for
some reason that feels bad to me. I'd like to do it with Proc objects,
if possible.

# Works by spamming the method namespace.
class Foo
def self.handle_type( type, &proc )
define_method( "dothing_#{type}", &proc )
end
# ...
def do_thing( type )
send "dothing_#{type}"
end
end

e

9/1/2006 11:53:00 PM

0

Phrogz wrote:
> Is there a way to call a proc while passing in the binding/scope for
> 'self'? I found an un-responded-to question on this (ruby-talk:12794)
> in 2001 which implies that, at least then, there was no way to do it.

I may be just feeling light-headed from COBOL, but
would #instance_eval not work here?

> What I'm doing:
> class Foo
> @@handlers = {}
>
> def self.handle_type( type, &proc )
> @@handlers[ type ] = proc
> end
>
> attr_reader :name
> def initialize( name )
> @name = name
> end
>
> def do_thing( type )
> @@handlers[ type ].call( self )

instance_eval &@@handlers[type]

> end
> end
>
> Foo.handle_type( :showname ){ |me|
> puts "My name is '#{me.name}'"
> }

Foo.handle_type(:showname) {puts "My name is #{self.name}"}

> f = Foo.new( 'f' )
> f.do_thing( :showname )
> #=> My name is 'f'
>
>
> What I'd like to do instead:
>
> Foo.handle_type( :showname ){
> puts "My name is '#{self.name}'"
> }


--
Posted via http://www.ruby-....