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

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

[reline] Suppress callbacks in pasting

  • Ruby 2.7 時点では irb の複数行のコードの貼付けが遅かった
  • それを改善した pull requst
  • すでにマージされ gem としてリリース済みなのでので手元で gem install reline 等で最新版にするとコードの貼付けがめっちゃ早くなっている

[Bug #17276] Ripper stops tokenizing after keyword as a method parameter

  • 次のようなケースで Ripper.tokenize の結果に end が含まれないケースがあるというバグ報告
require "ripper"

# これは end が含まれる
p Ripper.tokenize("def foo(); end")
# => ["def", " ", "foo", "(", ")", ";", " ", "end"]

# しかし、Ruby の構文として正しくない場合に end が含まれない
p Ripper.tokenize("def foo(&nil); end")
# => ["def", " ", "foo", "(", "&", "nil", ")"]
irb(main):001:1> def foo(&nil); end
irb(main):002:1>   end
irb(main):003:1>     end
irb(main):004:1>

[Misc #17199] id outputed by inspect and to_s output does not allow to find actual object_id and vice-versa

  • Ruby 2.7 から #inspect ( #to_s ) と #__id__ が返すアドレスの関連性が一致しなくなったという報告
  • 以下のように Ruby 2.7 と Rub 2.6 では挙動に差異がある
Object.new.tap { |o|
  p "#inspect=#{o.inspect}"
  # => "#inspect=#<Object:0x00005653c2d3abf0>"

  # Ruby 2.7 から #__id__ の値が変わった
  p "#__id__=#{o.__id__}"
  # Ruby 2.6 => "#__id__=47458875463160"
  # Ruby 2.7 => "#__id__=60"

  # __id__ の結果をシフトすると inspect に表示される id と同じになっていた
  p "shifted_id=#{(o.__id__ << 1).to_s(16)}"
  # Ruby 2.6 => "shifted_id=5653c2d3abf0"
  # Ruby 2.7 => "shifted_id=78"
}
  • また ObjectSpace._id2ref を利用した場合の挙動も壊れている
o = Object.new
# 任意の __id__ からそのオブジェクトが取得できる
pp ObjectSpace._id2ref(o.__id__)

# inspect から id を取得してそれを元にしてオブジェクトを取得する事ができた
# これが Ruby 2.7 からは動作しなくなっている
id_from_inspect = o.inspect[/#<Object:(.*)>/, 1].to_i(16)
pp ObjectSpace._id2ref(id_from_inspect >> 1)
  • アドレスなにもわからねえ…

[Feature #17266] Bundle TypeProf

  • TypeProf を bundled gem にするチケット
  • マージ済み

[Feature #17265] Add Bool module

  • FalseClass TrueClass の親モジュールとして Bool モジュールを追加しようという提案
  • モチベーションとしては RBSbool 型が使われているのでそれに合わせて Ruby 側でも定義しようという話っぽい?
  • RBS みたいに型を書く場合は便利そうだけど Ruby 上であると便利なんですかねー

[Feature #17279] Allow a negative step in Range#step with a block

# OK: これは動作する
p (6..3).step(-1).map { |i| i }
# => [6, 5, 4, 3]

# error: `step': step can't be negative (ArgumentError)
(6..3).step(-1) { |i| p i }
# error: `step': step can't be 0 (ArgumentError)
p (1..10).step(0) { |i| }

merge, fix されたチケット