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