From: nobu@... Date: 2014-04-13T05:11:19+00:00 Subject: [ruby-core:62004] [ruby-trunk - Feature #6869] Do not treat `_` parameter exceptionally Issue #6869 has been updated by Nobuyoshi Nakada. Description updated Alexey Muranov wrote: > Observe also that the use of repeated `_` parameter is not consistent between methods and blocks: for methods the value is the first assigned value, and for blocks it is the array of all the assigned values. It is unrelated to `_`, but because of `Enumerable#each_with_index`. Try: {0=>1}.each_with_index {|x,y| p x} # [0, 1] Alexey Muranov wrote: > It looks like the use of the underscore `_` as a "placeholder" is quite common in other languages ("black hole" register in Vim, "whatever" pattern that matches everything in Haskell), but there it is really a placeholder and not a variable: values "assigned" to `_` cannot be retrieved. Isn't it more exceptional? ---------------------------------------- Feature #6869: Do not treat `_` parameter exceptionally https://bugs.ruby-lang.org/issues/6869#change-46193 * Author: Alexey Muranov * Status: Open * Priority: Normal * Assignee: Yukihiro Matsumoto * Category: core * Target version: Next Major ---------------------------------------- I started by commenting on #6693, but i have realized that this is a slightly different request. I propose to not treat the variable name "`_`" exceptionally. Current behavior: ~~~ruby {0=>1}.each_with_index { |_,_| p _ } # [0, 1] ~~~ prints "[0, 1]", but ~~~ruby {1=>2}.each_with_index { |x,x| p x } # SyntaxError: (eval):2: duplicated argument name ~~~ raises "SyntaxError: (eval):2: duplicated argument name". Similarly for methods: ~~~ruby def f(_, _) _ end f(0, 1) # => 0 def f(x, x) x end # => SyntaxError: (eval):2: duplicated argument name ~~~ Observe also that the use of repeated `_` parameter is not consistent between methods and blocks: for methods the value is the first assigned value, and for blocks it is the array of all the assigned values. 1. I propose to use the same rule for all variables, without distinguishing `_` specially. In particular i propose to allow to repeat any variable, not only `_`, in block or method arguments without raising an error. There may be several solutions what the repeated argument will hold: it may hold the array of all assigned values, the first assigned value, the last assigned value, the first non-nil assigned value, or the last non-nil assigned value. 2. I propose to treat repeated arguments in methods and in blocks the same way (do not know which one). 3. For unused variables i propose to introduce a special placeholder, for example "`-`" not followed by anything other than a delimiter (comma or bracket): ~~~ruby each_with_index { |-, value| puts value } -, -, suffix = parse(name) ~~~ -- https://bugs.ruby-lang.org/