Bug #21049
openReconsider handling of the numbered parameters and "it" parameter in `Binding#local_variables`
Description
Currently, Binding#local_variable*
APIs wrongly handles the numbered parameters.
# Binding#local_variables includes numbered parameters that should not be visible
"foo".tap do
_1
"bar".tap do
p binding.local_variables #=> expected: [], actual: [:_1]
end
end
# Binding#local_variable_get can read numbered parameters that should not be readable
"foo".tap do
_1
"bar".tap do
p binding.local_variable_get(:_1) #=> expected: NameError, actual: "foo"
end
end
# Binding#local_variable_set can update numbered parameter
"foo".tap do
p _1 #=> "foo"
binding.local_variable_set(:_1, "bar") # expected: NameError, actual: updates _1
p _1 #=> "bar"
end
My proposal is to stop handling numbered parameters and "it" parameter in Binding#local_variable*
APIs.
"foo".tap do
_1
binding.local_variables #=> proposed: []
binding.local_variable_get(:_1) #=> proposed: NameError
end
Here is a proof-of-concept patch.
https://github.com/ruby/ruby/pull/12601
It would be theoretically possible to fix Binding#local_variable*
APIs to handle numbered parameters while maintaining compatibility as much as possible.
However, I think the implicit “it” parameter introduced in Ruby 3.4 poses a spec-level problem.
This is because there is no way to distinguish between the implicit “it” parameter and a true local variable named "it".
Also, I don't think numbered parameters are local variables, so I feel uncomfortable handling them by Binding#local_variable*
APIs.
If it is absolutely necessary to access numbered parameters or "it" parameter via binding, it would be good to introduce dedicated APIs for the purpose, as:
- Binding#numbered_parameters #=> [:_1, :_2, :_3, ...]
- Binding#numbered_parameter_get(:_1) #=> obj
- Binding#numbered_parameter_defined?(:_1) #=> true or false
- Binding#it_get #=> obj
- Binding#it_defined? #=> true or false
Personally, however, I do not see the need for these APIs currently. I implemented them as proof-of-concept in PR, but I am okay that they are not introduced.