Project

General

Profile

Bug #17167

Nested numbered parameters are not allowed

Added by sawa (Tsuyoshi Sawada) 2 months ago. Updated 2 months ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:99996]

Description

Numbered parameter is allowed in an ordinary block:

[[1, 2], [3, 4]].each{p _1}
# >> [1, 2]
# >> [3, 4]

as well as in a nested block:

[[1, 2], [3, 4]].each{|a| a.each{p _1}}
# >> 1
# >> 2
# >> 3
# >> 4

but not in both at the same time:

[[1, 2], [3, 4]].each{_1.each{p _1}}
# >> SyntaxError ((irb):2: numbered parameter is already used in) outer block here
# >> [[1, 2], [3, 4]].each{_1.each{p _1}}
                      ^~

I feel that this should be a bug.

Note that an error is not raised when an ordinary block parameter with the same name is used in the outer and the inner blocks:

[[1, 2], [3, 4]].each{|v| v.each{|v| p v}}
# >> 1
# >> 2
# >> 3
# >> 4

If this is not a bug, the specification of numbered parameters is too complex. How am I supposed to use numbered parameters in such use case as above?

Updated by matz (Yukihiro Matsumoto) 2 months ago

  • Status changed from Open to Closed

Unlike [[1, 2], [3, 4]].each{|v| v.each{|v| p v}}, nested numbered parametersin [[1, 2], [3, 4]].each{_1.each{p _1}} has no clue like |v| for nesting.
It is very hard to tell two _1 have different meanings.

It is a possible choice to allow users to shoot their feet, but we made a different decision here to avoid confusion.

Matz.

Also available in: Atom PDF