Scope of block

D

daniel

Hello i have a question about scopes of block
I want to define a block at one time.
But when it get's called it should have the scope (vars ed )
of the calling environement

Example :
------------------------------

class BlockTest

attr_accessor :myblock

def process(&block)
self.myblock = block
end
end


t = BlockTest.new
t.process {

"var = #{out_of_scope_var}"
}

out_of_scope_var = "daniel"
p t.myblock.call

Results in :

blocktest.rb:15: undefined local variable or method `out_of_scope_var'
for main:Object (NameError) from blocktest.rb:19

How can i call the proc so that the out_of_scope_var is known :

result would be :

so i would get :

daniel-wijnands-powerbook58-2:~/jim/vendor/plugins/widget_grid/lib
danielwijnands$ ruby blocktest.rb
"var = daniel"
 
D

daniel

Paul Lutus schreef:
Perhaps you will be satisfied that the block receive values from the parent
environment. This is the normal way to solve the problem.

That is how it is solved now, but the proc needs to be flexible.
I call much proc's and i don't now what to pass.
It are not just vars that i want to accessible but also methods ed

Any idea ?
 
G

Gustav Paul

daniel said:
Hello i have a question about scopes of block
I want to define a block at one time.
But when it get's called it should have the scope (vars ed )
of the calling environement

Example :
------------------------------

class BlockTest

attr_accessor :myblock

def process(&block)
self.myblock = block
end
end


t = BlockTest.new
t.process {

"var = #{out_of_scope_var}"
}

out_of_scope_var = "daniel"
p t.myblock.call

Results in :

blocktest.rb:15: undefined local variable or method `out_of_scope_var'
for main:Object (NameError) from blocktest.rb:19

How can i call the proc so that the out_of_scope_var is known :

result would be :

so i would get :

daniel-wijnands-powerbook58-2:~/jim/vendor/plugins/widget_grid/lib
danielwijnands$ ruby blocktest.rb
"var = daniel"
The following seems to work:
#########
class BlockTest
def process(&block)
@block=block
end

def myblock
instance_eval{@block}.call
end
end

out_of_scope_var = "out of scope, me"
t = BlockTest.new
t.process {"var = #{out_of_scope_var}"}

p t.myblock
#=> "var = out of scope, me"
###########
Hope this helps,
Gustav Paul
 
D

dblack

Hi --

The following seems to work:
#########
class BlockTest
def process(&block)
@block=block
end

def myblock
instance_eval{@block}.call

No need for instance_eval there. @block already belongs to self, and
the instance_eval just resets self to self :)


David

--
David A. Black | (e-mail address removed)
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org
 
D

daniel

Gustav Paul schreef:
The following seems to work:
#########
class BlockTest
def process(&block)
@block=block
end

def myblock
instance_eval{@block}.call
end
end

out_of_scope_var = "out of scope, me"
t = BlockTest.new
t.process {"var = #{out_of_scope_var}"}

p t.myblock
#=> "var = out of scope, me"
###########
Hope this helps,
Gustav Paul

Hi paul, i know that's works, but i need it slightly differtent
because you set out_of_scope_var before you create the block
I want it to be accessible when you set it after you create the block
With your method it is in the scope of the block
I want the block to have access to the scope when you call it
So this should work :


class BlockTest
def process(&block)
@block=block
end
def myblock
instance_eval{@block}.call
end
end


t = BlockTest.new
t.process {"var = #{out_of_scope_var}"}



out_of_scope_var = "out of scope, me"
p t.myblock


But that gives :

blocktest.rb:40: undefined local variable or method `out_of_scope_var'
for main:Object (NameError)
from blocktest.rb:34:in `myblock'
from blocktest.rb:45

:( thanks anyway :)
 
N

NoonKnight

you could add an eval() into your example code, so that:

t = BlockTest.new
t.process { "var = #{out_of_scope_var}" }
out_of_scope_var = "daniel"
p t.myblock.call

would become:

t = BlockTest.new
t.process { "var = #{eval('out_of_scope_var'}" }
out_of_scope_var = "daniel"
p t.myblock.call

hope that helps. --noon
 
N

NoonKnight

oops, i forgot to put the closing paren. should be:

t.process { "var = #{eval('out_of_scope_var')}" }

--noon
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,015
Latest member
AmbrosePal

Latest Threads

Top