Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Calling a block with parameters in a new scope

Reply
Thread Tools

Calling a block with parameters in a new scope

 
 
Ruby Talk
Guest
Posts: n/a
 
      05-20-2007
Calling a block in a new scope is easy enough:

self.instance_eval &block

And calling a block, passing it parameters is easy enough:

block.call(*params)

But is there some way to do both? To both change the scope of evaluation
and pass variables into the block.

 
Reply With Quote
 
 
 
 
Matt Gretton
Guest
Posts: n/a
 
      05-20-2007
Ruby Talk wrote:
> Calling a block in a new scope is easy enough:
>
> self.instance_eval &block
>
> And calling a block, passing it parameters is easy enough:
>
> block.call(*params)
>
> But is there some way to do both? To both change the scope of evaluation
> and pass variables into the block.


Hello,

I'm not sure I fully understand the question being asked here. Can you
provide a small bit of code to highlight what you are trying to acheive.

Do you wish to pass vaiables into the instance_eval block?

Any variables in scope when the instance_eval block is called can be
used in the instance_eval block itself. However, if you were to pass a
proc object into the instance_eval it would retain the context it was
created at.

See below for an example of this.

class Test
def initialize(arg)
@instance_variable = arg
end
end

test_obj = Test.new("initializing_arg")

outside = "outside instance_eval"

proc = Proc.new {|arg| puts self} #self main here

test_obj.instance_eval do
puts @instance_variable #test_obj instance variable.
puts outside #any variable from outside the block can be passed in.
puts proc #will return main rather than the object
end

Hmm, I get the feeling I have ranted about stuff that does not help you
one bit with your question...

Get back to me with a bit more detail and hopefully I'll be able to
help!

Cheers,

Matt.



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

 
Reply With Quote
 
 
 
 
Matt Gretton
Guest
Posts: n/a
 
      05-20-2007
Matt Gretton wrote:
> Ruby Talk wrote:
>> Calling a block in a new scope is easy enough:
>>
>> self.instance_eval &block
>>
>> And calling a block, passing it parameters is easy enough:
>>
>> block.call(*params)
>>
>> But is there some way to do both? To both change the scope of evaluation
>> and pass variables into the block.

>
> Hello,
>
> I'm not sure I fully understand the question being asked here. Can you
> provide a small bit of code to highlight what you are trying to acheive.
>
> Do you wish to pass vaiables into the instance_eval block?
>
> Any variables in scope when the instance_eval block is called can be
> used in the instance_eval block itself. However, if you were to pass a
> proc object into the instance_eval it would retain the context it was
> created at.
>
> See below for an example of this.
>
> class Test
> def initialize(arg)
> @instance_variable = arg
> end
> end
>
> test_obj = Test.new("initializing_arg")
>
> outside = "outside instance_eval"
>
> proc = Proc.new {|arg| puts self} #self main here
>
> test_obj.instance_eval do
> puts @instance_variable #test_obj instance variable.
> puts outside #any variable from outside the block can be passed in.
> puts proc #will return main rather than the object
> end
>
> Hmm, I get the feeling I have ranted about stuff that does not help you
> one bit with your question...
>
> Get back to me with a bit more detail and hopefully I'll be able to
> help!
>
> Cheers,
>
> Matt.



Oops, that last 'puts proc' should be proc.call("whatever")

If full:

class Test
def initialize(arg)
@instance_variable = arg
end
end

test_obj = Test.new("initializing_arg")

outside = "outside instance_eval"

proc = Proc.new {|arg| puts self} #self main here

test_obj.instance_eval do
puts @instance_variable #test_obj instance variable.
puts outside #any variable from outside the block can be passed in.
proc.call("whatever") #will return main rather than the object
end


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

 
Reply With Quote
 
Phrogz
Guest
Posts: n/a
 
      05-20-2007
On May 19, 10:07 pm, Ruby Talk <(E-Mail Removed)> wrote:
> self.instance_eval &block
>
> And calling a block, passing it parameters is easy enough:
>
> block.call(*params)
>
> But is there some way to do both? To both change the scope of evaluation
> and pass variables into the block.


http://eigenclass.org/hiki.rb?instance_exec

 
Reply With Quote
 
Robert Dober
Guest
Posts: n/a
 
      05-20-2007
On 5/20/07, Phrogz <(E-Mail Removed)> wrote:
> On May 19, 10:07 pm, Ruby Talk <(E-Mail Removed)> wrote:
> > self.instance_eval &block
> >
> > And calling a block, passing it parameters is easy enough:
> >
> > block.call(*params)
> >
> > But is there some way to do both? To both change the scope of evaluation
> > and pass variables into the block.

>
> http://eigenclass.org/hiki.rb?instance_exec
>
>
>

OP We have just discussed this twice recently, maybe you should browse
the recent posts...

Phrogz: Your link seems outdated,
c.f.http://eigenclass.org/hiki/bounded+space+instance_exec
for a discussion of #undef_method (bad) vs. #remove_method (good) and
please note the potential danger of endless recursion.

Cheers
Robert


--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Fo:Block can you check to see if a block contains any text by using the block id? morrell XML 1 10-10-2006 07:18 PM
Scope - do I need two identical classes, each with different scope? ann Java 13 09-13-2005 03:07 AM
Store erb block and alter scope of erb block eval? Steve V Ruby 6 04-20-2005 09:26 PM
IMPORT STATIC; Why is "import static" file scope? Why not class scope? Paul Opal Java 12 10-10-2004 11:01 PM



Advertisments