😽

[Feature #21515] &return という構文を追加する提案

に公開

[Feature #21515] Add &return as sugar for x=my_calculation; return x if x

  • 以下のようなコードを
x = my_calculation(input_a, input_b)
return x if x
  • 以下のような &return という構文で定義できるようにする提案
&return my_calculation(input_a, input_b)
  • とは?という感じなんですが元々のモチベーションとしては次のような後置 if の場合に
return my_calculation(input_a, input_b) if my_calculation(input_a, input_b)
  • コードが冗長だったり my_calculation が2回呼び出されてしまう問題がある
  • これを解決する場合は次のように変数に一度代入する必要がある
my_calc = my_calculation(input_a, input_b)
return my_calc if my_calc
  • my_calculation が高コストなことに気づければいいが、気づけない場合は元のコードでは問題があるのでより簡略化してかけるようにしたい、というモチベーションみたいですね
  • 流石に &return という構文から元のコードを読み取るのはかなり厳しい気がしますねえ…
  • これに対してコメントではいくつかの代替案が出されている
# 条件式で変数を定義してそれを返す
return result if result = my_calculation(input_a, input_b)
# and を使って return を右辺に持ってくる
x = my_calculation(input_a, input_b) and return x
# &.then を使ってレシーバが nil 出ないときのみ return する
my_calculation(input_a, input_b)&.then { return it }
  • これに対して起票者は『そもそも変数を書きたくない(名前を考えたくない)』『 &.then の場合はわずかながらパフォーマンスに影響する』みたいな点が気になっているみたいですね
  • https://bugs.ruby-lang.org/issues/21515#note-7
  • それ以外のコメントでは if の条件式の結果を参照する新しいキーワードを追加する案もコメントされている
  • https://bugs.ruby-lang.org/issues/21515#note-8
# that が if xxx の結果を参照する
return that if @cache[key]
puts that if my_calculation
x = that + 42 if my_calculation
  • $!$@ みたいなものとしてはそこまで違和感がなかったりするんですかね…?
  • 個人的には以下のようなコードを書くときに便利なのでこっちはあったら追加いそうな気もする
if user = User.find(id)
  hoge(user)
end
# 以下のようにかける
if User.find(id)
  hoge(that)
end
GitHubで編集を提案

Discussion