Bug #16340
closedThere are cases where `eval("_ 1")` does not refer to Numbered parameter
Description
Steps to reproduce¶
- Define local variable
_1
outside block - Call Numbered parameter in block
- Call
eval("_1")
in same block
Expected behavior¶
_1 = :local_variable
proc {
_1
# return Numbered parameter(_1)
eval("_1") # => :argument
}.call :argument
Actual behavior¶
_1 = :local_variable
proc {
_1
# return local variables outside block
eval("_1") # => :local_variable
}.call :argument
This is strange behavior because I want to expect to reference _1
in block.
Note¶
- Return Numbered parameter if not define local variables outside block
# _1 = :local_variable
proc {
_1
# Actual behavior
# return Numbered parameter
eval("_1") # => :argument
}.call :argument
Updated by Eregon (Benoit Daloze) over 4 years ago
- Status changed from Open to Rejected
I think the behavior is expected.
_1
is a local variable in your example and eval can access local variables outside of it.
However, I don't think _1
can work as numbered parameter inside an eval for a block outside the eval, because then we'd change the block arity dynamically.
What would be the Proc#arity of lambda { _1 + eval("_#{rand(5)}") }.arity
?
IMHO, _1
shouldn't be supported inside eval
as a numbered parameter when it refers to something outside eval
.
So I think the current behavior is fine, and needs to be kept for compatibility if _<n>
is used as a local variable.
Do you have any realistic use case where you would want your expected behavior?
I mark this as rejected because I believe it's unsolvable.
Updated by osyo (manga osyo) over 4 years ago
Thanks comment!
Do you have any realistic use case where you would want your expected behavior?
No.
However, I thought it was strange behavior and reported.
I agree to reject.