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

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

[Feature #17303] Remove webrick from stdlib

[Feature #17371] Reintroduce expr in pat

  • Ruby 2.7 で入った1行 in=> に置き換わる形で一旦削除された
  • これを => とは違い真理値を返す形で復活させる提案
  • これを利用すると条件分岐などで in を使えるようになる
# version 2.7
0 in 1 #=> raise NoMatchingPatternError

# version 3.0
0 in 1 #=> false
# name が String 型で age が20以下の場合にマッチする
if user in { name: String, age: (..20) }
  puts "OK"
end
users = [
  { name: "homu", age: 14 },
  { name: "mami", age: 15 },
  { name: "mado", age: 14 },
]
# こんな感じで絞り込むことができる
pp users.select { _1 in { name: /^m/, age: (...15) } }

[Feature #17314] Provide a way to declare visibility of attributes defined by attr* methods in a single expression

  • 以前も紹介したチケット
  • 以下のような変更を行う内容
class Foo
  protected [:x, :y]
  # same as:
  protected :x, :y

  attr_accessor :foo, :bar # => [:foo, :foo=, :bar, :bar=] instead of `nil`
  attr_reader :foo, :bar # => [:foo, :bar] instead of `nil`
  attr_writer :foo, :bar # => [:foo=, :bar=] instead of `nil`

  alias_method :new_alias, :existing_method # => :new_alias instead of `Foo`
end
  • これを利用すると以下のようにかける
class Foo
  private attr_accessor :foo, :bar
end
  • これはまつもとさんが承認したので Ruby 3.0 に入りそう
    • ただし、まだマージはされていない

[Feature #8382] Format OpenStruct YAML dump and create getters and setters after load.

  • OpenStructYAML への変換をサポートしたチケット
  • すでに OpenStruct 側で取り込まれており Ruby 2.7.2 でも使えた
require "ostruct"
require "yaml"

h = { name: "John Smith", age: 70, pension: 300.0 }
os = OpenStruct.new(h)
pp os.to_yaml
# Ruby 2.7.1
# "--- !ruby/object:OpenStruct\n" +
# "table:\n" +
# "  :name: John Smith\n" +
# "  :age: 70\n" +
# "  :pension: 300.0\n"

# Ruby 2.7.2
# "--- !ruby/object:OpenStruct\n" +
# "name: John Smith\n" +
# "agf: 70\n" +
# "pension: 300.0\n"

[Feature #17384] shorthand of Hash#merge

  • Hash#merge のショートハンドの提案チケット
  • Hash#+#merge する
a = {k: 1}
b = {j: 2}
c = a.merge(b)
d = a + b # same as c
  • これは以下のチケットと重複している
  • 便利そうな気もするけどウーン

[PR #3904] Skip defined instruction in NODE_OP_ASGN_OR with ivar

$VERBOSE = true

# Ruby 2.7.2 : warning: instance variable @value not initialized
# Ruby 3.0.0 : no warning
pp @value
  • この変更で @foo ||= 123 時に不要なオーバーヘッドがあったのでそれを削除した PR
  • 背景としては元々 @foo ||= 123@foo || (@foo = 123) と展開してしまうと後者の場合、警告がでてしまっていた
$VERBOSE = true

# no warning
@foo ||= 123
# warning: instance variable @foo not initialized
@foo || (@foo = 123)
  • これを対処するために @foo ||= 123 では警告が出ないようにするための命令が追加されていた
    • 多分擬似的に @foo を定義しているような命令?
  • しかし、Ruby 3.0 で警告が出なくなった為、この命令は不要になり削除された、という経緯になる
  • 単純に @foo ||= 123 のパフォーマンスが上がったそうなので普通に便利そう

merge, fix されたチケット