【一人 bugs.ruby Advent Calendar 2020】[Bug #17058] Array#delete_if doesn't change array instantly【9日目】

一人 bugs.ruby Advent Calendar 2020 9日目の記事になります。

[Feature #13820] Add a nil coalescing operator

このチケットは Ruby?? 演算子を追加しよう、というチケットになります。
?? 演算子|| 演算子と似ているのですが『左辺が nil のときのみ右辺を評価する』という演算子になります。

# || 演算子
42 || "homu"     # => 42
nil || "homu"    # => "homu"
false || "homu"  # => "homu"

# ?? 演算子
42 ?? "homu"     # => 42
nil ?? "homu"    # => "homu"
false ?? "homu"  # => false

こんな感じで false || "homu"false ?? "homu" で意味が異なります。
ユースケースとしては以下のように意図的に false が値として受け取る可能性がある場合に || だと意図しない動作をする可能性がある場合に利用できる、と提示されています。

def fetch(id, **opts)
def fetch(id, **opts)
  host  = opts[:host] || default_host
  https = opts[:https] || true
  port  = opts[:port] || (https ? 443 : 80)
  # ...
end
  host  = opts[:host] || "default_host"
  # https: false の場合は false になってほしいのに true になってしまう…
  https = opts[:https] || true
  port  = opts[:port] || (https ? 443 : 80)
  # ...
  pp host   # => "default_host"
  pp https  # => true
  pp port   # => 443
end

fetch(1, https: false)

他にも ||= したときに『 false だった場合でもメモ化したい』という動作を行いたい場合に利用できます。

# foo の戻り値が false だった場合にもう一度 foo が呼び出される
@hoge ||= foo(...)

## ??= だと false だった場合に foo が呼び出されない
@hoge ||= foo(...)

実際に上記のようなケースに出くわしたことはないんですが、 ?? 演算子があるといろいろと考慮する点があると思いました。
提案されているだけだとなかなか利点がわからないんですが、実際に使ってみると便利そうな機能ですねー。