2020/10/08 今週の気になった bugs.ruby のチケット

内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。
あくまでも『わたしが気になったチケット』で全ての bugs.ruby のチケットを載せているわけではありません。

[Feature #17208] Add Set#compact and Set#compact! methods

  • Array#compactHash#compact があるので Set#compact も追加しよう、という提案
# Set#compact!
# Removes all nil elements from self. Returns self if any elements removed, otherwise nil.
set = Set[1, 'c', nil]            #=> #<Set: {1, "c", nil}>
set.compact!                      #=> #<Set: {1, "c"}>
set                               #=> #<Set: {1, "c"}>

set = Set[1, 'c']                 #=> #<Set: {1, "c"}>
set.compact!                      #=> nil
set                               #=> #<Set: {1, "c"}>
# Set#compact
# Returns a new Set containing all non-nil elements from self.
set = Set[1, 'c', nil]            #=> #<Set: {1, "c", nil}>
set.compact                       #=> #<Set: {1, "c"}>
set                               #=> #<Set: {1, "c", nil}>

set = Set[1, 'c']                 #=> #<Set: {1, "c"}>
set.compact                       #=> #<Set: {1, "c"}>
set                               #=> #<Set: {1, "c"}>
  • Set 全然使ったことがないんですが #compact があると便利なんですかね?
  • 一応 .reject(&:nil?) で代替することは可能

[Feature #17210] More readable and useful Set#inspect

  • Set#inspect の結果をより Ruby のコードに寄せようという提案
# before
puts Set[1,2,3] # => "#<Set: {1, 2, 3}>"

# after
puts Set[1,2,3] # => "Set[1, 2, 3]"
  • これは普通に便利そう
  • こういうのの『スタイルガイド』があるといいんじゃないか、とコメントされてる

[Feature #13820] Add a nil coalescing operator

  • ?? 演算子を追加しよう、という提案
  • ??|| と類似しているが左辺が nil のときのみ右辺を評価する
    • 左辺が false の場合は右辺を評価しない
  • 動作イメージは以下のような感じ
# || 演算子
42 || "homu"     # => 42
nil || "homu"    # => "homu"
false || "homu"  # => "homu"

# ?? 演算子
42 ?? "homu"     # => 42
nil ?? "homu"    # => "homu"
false ?? "homu"  # => false
  • ユースケースとしては以下のように意図的に 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)