Feature #6869

Updated by nobu (Nobuyoshi Nakada) about 7 years ago

 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: 


  {0=>1}.each_with_index { |_,_| p _ } # [0, 1] 

 prints "[0, 1]", but 


  {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: 


  def f(_, _) 
  f(0, 1) # => 0 

  def f(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): 


  each_with_index { |-, value| puts value } 

  -, -, suffix = parse(name)