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
モジュールを追加しようという提案- モチベーションとしては RBS で
bool
型が使われているのでそれに合わせて Ruby 側でも定義しようという話っぽい? - RBS みたいに型を書く場合は便利そうだけど Ruby 上であると便利なんですかねー
[Feature #17279] Allow a negative step in Range#step with a block
- 今は
Range#step
に-1
とブロック引数を渡すとエラーになる- ちなみに
Range#step
はブロックを渡さなかった場合にEnumerator
を返す - https://docs.ruby-lang.org/ja/latest/method/Range/i/=25.html
- ちなみに
# 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 }
-1
をエラーにしても意味がないのでこれを許容しようという提案- 関連するチケットで
0
を渡すのも許容しようというのもある
# error: `step': step can't be 0 (ArgumentError) p (1..10).step(0) { |i| }
merge, fix されたチケット
- [Feature #17266] Bundle TypeProf
- TypeProf を bundled gem にするチケット