💨

[Feature #21435] Kernel#then と同じような Kernel#then_try を追加する提案

に公開

[Feature #21435] Kernel#then_try as a conditional #then

  • Kernel#then と同じような Kernel#then_try を追加する提案
  • 最初は #then_try という名前ではなくて #optional という名前で提案してしていたみたい
  • #then とは『異なりブロックの戻り値が偽の場合はレシーバの値を返す』という挙動になる
# 実装はこんな感じ
module Kernel
  def then_try
    tap do
      result = yield(self) or next

      break result
    end
  end
end

pp 42.then_try { _1 + _1 } # => 84
pp 42.then_try { nil }     # => 42
  • これは
@record = Record.find(record_id)
  .then { it.respond_to?(:decorate) ? it.decorate : it }
  • のようなコード
@record = Record.find(record_id)
  .then_try { it.decorate if it.respond_to? :decorate }
  • みたいにかけるイメージですね
  • わたしはこういうケースだと以下のように #tap + break で書くことは多いんですがまあ〜こういうのがほしいのはわかる
@record = Record.find(record_id)
  .tap { break it.decorate if it.respond_to? :decorate }
  • わかるんですが提案された #then_try がそこまでわかりやすかったりする利便性はそこまで感じないんですよねえ
  • わかりやすいさもそうだし、特にコード量が極端に減ったりもしてないので
  • どうせならもっといい感じにかけるような構文があるとよい気はするんですが
  • コメントを見てみると最初に提案していた #optional という名前に対してやそもそも機能に対してあんまりポジティブな意見はなさそうですねえ
GitHubで編集を提案

Discussion