[ruby-core:95787] [Ruby master Bug#16340] There are cases where `eval("_ 1")` does not refer to Numbered parameter
From:
eregontp@...
Date:
2019-11-11 13:40:19 UTC
List:
ruby-core #95787
Issue #16340 has been updated by Eregon (Benoit Daloze).
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.
----------------------------------------
Bug #16340: There are cases where `eval("_ 1")` does not refer to Numbered parameter
https://bugs.ruby-lang.org/issues/16340#change-82608
* Author: osyo (manga osyo)
* Status: Rejected
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.7.0dev (2019-11-11T10:03:43Z trunk 9d3213ac85) [x86_64-linux]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
## Steps to reproduce
1. Define local variable `_1` outside block
2. Call Numbered parameter in block
3. Call `eval("_1")` in same block
## Expected behavior
```ruby
_1 = :local_variable
proc {
_1
# return Numbered parameter(_1)
eval("_1") # => :argument
}.call :argument
```
## Actual behavior
```ruby
_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
```ruby
# _1 = :local_variable
proc {
_1
# Actual behavior
# return Numbered parameter
eval("_1") # => :argument
}.call :argument
```
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>