2020/12/17 今週の気になった bugs.ruby のチケット
内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。
あくまでも『わたしが気になったチケット』で全ての bugs.ruby のチケットを載せているわけではありません。
[Feature #17303] Remove webrick from stdlib
- webrick を標準ライブラリから削除するチケット
- webrick には脆弱性の問題がありサポートするのが難しいという旨が書かれている
- このチケットはすでにマージ済みで今後は独自 gem として開発されていく予定
- webrick を使っているプロダクトは別途
gem "webrick"
を追加して対応する必要がある
[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) } }
- 元々 1行
in
は真理値を返す用途で実装されたが紆余曲折あって Ruby 2.7 ではマッチしなかった場合は例外を返すような挙動になった - なので条件分岐で使えなくて残念だと思っていたのでこれは嬉しい変更
- ただし、Ruby 3.0 では
experimental warning
が出るので注意 - 参照
[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.
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
- [Feature #17055] Allow suppressing uninitialized instance variable and method redefined verbose mode warnings で 『未初期化のインスタンス変数を参照』時に警告がでなくなった
-W
等の場合のみ出てた
$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 されたチケット
- [Feature #17055] Allow suppressing uninitialized instance variable and method redefined verbose mode warnings
-W
で未初期化のインスタンス変数を参照しても警告が出なくなった
- [Feature #17303] Remove webrick from stdlib
- webrick が標準ライブラリから削除された