【一人 bugs.ruby Advent Calendar 2021】[Feature #17768] Proposal: Downward assignments【1日目】

一人 bugs.ruby Advent Calendar 2021 1日目の記事になります。
さて、去年に引き続き今年も『毎週気になった bugs.ruby のチケットをまとめてみる』ということを継続してやっていました。

と、言うことで今年も去年に引き続き Advent Calendar で今年気になったチケット的なやつをまとめてみようかなーと思います。
例によって内容はあんまりつめつめじゃなくて軽く紹介していく感じになります。

[Feature #17768] Proposal: Downward assignments

次のように変数を下の行で定義する提案になります。

# var = 42 と同じ
42
^^var

# 中間の式も代入できる
p(2 * 3 * 7)  #=> 42
  ^^^^^var

p var         #=> 6

実際のユースケースとしていくつか紹介されています。

while (line = gets) != nil
  p line
end

# ↓↓↓

while gets != nil
      ^^^^line
  p line
end
ary = [1, 2, 3, 4, 5]

ary.each {|elem| found = elem if elem.even? }

p found  #=> 4

# ↓↓↓

ary = [1, 2, 3, 4, 5]

ary.each {|elem| elem if elem.even? }
                 ^^^^found

p found  #=> 4
class C
  def initialize(foo, bar)
    @foo = foo
    @bar = bar
  end
end

# ↓↓↓

class C
  def initialize(foo,    bar)
                 ^^^@foo ^^^@bar
end

めっちゃ便利そう!!!! しかし、残念ながらこれはエイプリルフールのネタチケットなので 4月1日を過ぎたらシュッとクローズされてしまいました。悲しい。
ちなみにエイプリルフールのネタではあるんですがちゃんと patch ファイルも付いていてパッチを当てると以下の Ruby のコードがちゃんと動きます。すごい。

(2 * 3 * 7)
  ^^^^^var

p var


while gets != nil
      ^^^^line
  p line
end


ary = [1, 2, 3, 4, 5]

ary.each {|elem| elem if elem.even? }
                 ^^^^found

p found  #=> 4

どうやってやってるの…。