No, this isn't April Fool's Day. I'm seriously wondering
if this has ever been considered.
I can only think of one place I'd use it -- to turn hashes
(used as named parameters) into real variables.
Something like:
def meth(hash)
bind = binding
hash.each_pair {|k,v| local_variable_set(k,v,bind) }
# Assuming call was: meth(alpha: 123, beta: 234, gamma: 345)
# we now can reference alpha, beta, and gamma as ordinary
# variables...
end
I think making bindings writeable has been suggested:
binding[:alpha] = 123
or whatever.
Thoughts?
To me it suggests too tight a coupling between the caller and the
method. If you write a method that depends on being told to create a
local variable with a particular name, you're limiting what can be
done by way of refactoring and reimplementing the method.
No, this isn't April Fool's Day. I'm seriously wondering
if this has ever been considered.
I can only think of one place I'd use it -- to turn hashes
(used as named parameters) into real variables.
Something like:
def meth(hash)
bind = binding
hash.each_pair {|k,v| local_variable_set(k,v,bind) }
# Assuming call was: meth(alpha: 123, beta: 234, gamma: 345)
# we now can reference alpha, beta, and gamma as ordinary
# variables...
end
I think making bindings writeable has been suggested:
binding[:alpha] = 123
or whatever.
Thoughts?
To me it suggests too tight a coupling between the caller and the
method. If you write a method that depends on being told to create a
local variable with a particular name, you're limiting what can be
done by way of refactoring and reimplementing the method.
Maybe not, though. I guess the idea would be that the caller is
supposed to send those names in a hash anyway. I think I might find
it weird, though, to see:
def meth(hash)
bind = binding
hash.each_pair {|k,v| local_variable_set(k,v,bind) }
puts alpha
beta += 2
if defined?(gamma)
puts "gamma came from somewhere..."
etc., without having any visual cues (arglist or assignment) as to
where those names came from.
The eval("lambda{|x| #{lvar} = x}", somebinding).call(val) trick won't
allow you to create new locals and refer to them normally. Taking the
example from the OP:
# hash is {:alpha => 1, :beta => 2, :x => 0}
alpha = beta = nil # you can't get rid of this in the current implementation
bind = binding
hash.each_pair {|k,v| local_variable_set(k,v,bind)
# we can use alpha & beta normally, but x requires eval("x")
···
On Mon, Oct 10, 2005 at 12:57:27PM +0900, Devin Mullins wrote:
Hal Fulton wrote:
>No, this isn't April Fool's Day. I'm seriously wondering
>if this has ever been considered.