Feature #8773
closedBinding#local_variables should work like #local_variable_set and #local_variable_get
Description
With the addition of Binding#local_variable_get and Binding#local_variable_set the following seemed reasonable:
def get_all_local_variables(bind)
lvars = bind.send(:local_variables)
# `lvars` should equal [:x, :y], but equals [:bind, :lvars]
lvars.map {|name| bind.local_variable_get name }
end
x = 1
y = 2
get_all_local_variables(binding) # NameError: local variable `bind' not defined for #<Binding:0x0>
This is because `local_variables' is global and uses the current stack frame. That was not obvious to me. I could have just used binding.eval("local_variables") but that looked very strange when used alongside binding.local_variable_set and binding.local_variable_get.
Attached is a patch that gives Binding an instance method that properly lists the local variables defined in the binding. It now works like this:
def get_all_local_variables(bind)
lvars = bind.local_variables
# `lvars` equals [:x, :y]
lvars.map {|name| bind.local_variable_get name }
end
x = 1
y = 2
set_everything_but_x_to_5(binding) # => [1, 1]
Here's a GitHub link if you want to see it with colors: https://github.com/JackDanger/ruby/pull/1/files
Files
Updated by jackdanger (Jack Danger) over 11 years ago
- File 0001-Allowing-binding-to-list-its-local-variables.patch 0001-Allowing-binding-to-list-its-local-variables.patch added
I left a typo in the description field of this issue. The very last line of code in the example should read:
get_all_local_variables(binding) #=> [1, 2]
Updated by tenderlovemaking (Aaron Patterson) over 11 years ago
@ko1 (Koichi Sasada) do you have any thoughts about this?
Updated by nobu (Nobuyoshi Nakada) about 11 years ago
- Tracker changed from Bug to Feature
Sounds reasonable.
Updated by nobu (Nobuyoshi Nakada) about 11 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r44392.
Jack, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
proc.c: Binding#local_variables
- proc.c (bind_local_variables): allowing binding to list its
local variables. patch by Jack Danger Canty at [ruby-core:56543]. [Feature #8773]