Project

General

Profile

Bug #16178

Updated by Eregon (Benoit Daloze) over 4 years ago

Currently on trunk: 
 ```ruby 
 array = ["string", 42, [1, 2]] 

 array.map { |x| x * 2 } 
 # => ["stringstring", 84, [1, 2, 1, 2]] 

 array.map { _1 * 2 } 
 # => ["stringstring", 84, 2] 
 ``` 

 Oops, this trivial code just lost data and completely ignored the element class! 
 This is clearly contrary to intuition and is very dangerous. 

 Using `_0` instead has the correct behavior but it's clear we use 1-based indexing for numbered parameters, 
 and it doesn't solve that `_1` has dangerous behavior. 

 Basically the current behavior is that `_0` is the same as `|x|` and `_1` is the same as `|x,|`. 
 `|x,|` is almost never used in Ruby, and for good reasons, it just throws away data/information/the class of the object. 
 Such a dangerous operation should only be done when it's explicit, and the trailing comma in `|x,|` shows that, but `_1` does not. 

 So let's make `_1` be `|x|` and remove `_0`. 

 I am going to be harsh, but this discussion has gone too long without any serious written argument for the current behavior: 
 I believe it's irrational and irresponsible to have `_1` be `|x,|`, it's just going to lead to nasty bugs. 

 Try to convince me otherwise. 
 If not, in one week I want to apply this change. 

 From the discussion in https://bugs.ruby-lang.org/issues/15723#note-127 
 and in https://bugs.ruby-lang.org/issues/15708 

 Some reactions to this behavior in https://twitter.com/eregontp/status/1115318993299083265

Back