I have this code:
l = lambda { a }
def some_function
a = 1
end
I just want to access a
by the lambda and a special scope which has defined a
already somewhere like inside some_function
in the example, or just soon later in the same scope as:
l = lambda { a }
a = 1
l.call
Then I found when calling l
, it is still using its own binding but not the new one where it was called.
And then I tried to use it as:
l.instance_eval do
a = 1
call
end
But this also failed, it is strange that I can't explain why.
I know the one of the solution is using eval
, in which I could special a binding and executing some code in text, but I really do not want to use as so.
And, I know it is able to use a global variable or instance variable. However, actually my code is in a deeper embedded environment, so I don't want to break the completed parts if not quite necessary.
I have referred the Proc
class in the documentation, and I found a function names binding
that referred to the Proc
's context. While the function only provided a way to access its binding but cannot change it, except using Binding#eval
. It evaluate text also, which is exactly what I don't like to do.
Now the question is, do I have a better (or more elegant) way to implement this? Or using eval
is already the regular manner?
Edit to reply to @Andrew:
Okay, this is a problem which I met when I'm writing a lexical parser, in which I defined a array with fixed-number of items, there including at least a Proc
and a regular expression. My purpose is to matching the regular expressions and execute the Procs under my special scope, where the Proce will involved some local variables that should be defined later. And then I met the problem above.
Actually I suppose it is not same completely to that question, as mine is how to pass in binding to a Proc rather than how to pass it out.
@Niklas: Got your answer, I think that is what exactly I want. It has solved my problem perfectly.