2021/02/04 今週の気になった bugs.ruby のチケット
内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。
あくまでも『わたしが気になったチケット』で全ての bugs.ruby のチケットを載せているわけではありません。
[Bug #10593] Emoji is been considered as comment
#️⃣
絵文字以降がコメントアウトとして扱われてしまうというバグ報告
#️⃣ これはコメントアウトです #️⃣ Ruby のコードは実行されません puts "hello, world" #️⃣ コメント
- これは
#️⃣
が囲み文字と呼ばれている絵文字で# + 特殊なコードポイント
で表現されているためです#️⃣
のバイト列がU+0023 + U+FE0F + U+20E3
となる- 参照:めくるめくEmojiの世界/emoji-world
- 実際に字句解析するとこんな感じ
require "ripper" # コメントとして字句解析される p Ripper.lex("#️⃣") # => [[[1, 0], :on_comment, "#️⃣", BEG]] # こっちは普通の文字になる p Ripper.lex("😀") # => [[[1, 0], :on_ident, "😀", CMDARG]]
- これは仕様ということで閉じられている
[Bug #7877] E::Lazy#with_index should be lazy
Enumerable::Lazy#with_index
が Ruby 2.6 と 2.7 で挙動が変わっていたので調べていたらこのチケットを見つけました
# Ruby 2.6 だとブロックの中身が呼ばれるが、2.7 だと呼ばれない pp [1, 2, 3].lazy.with_index { |it, i| l} # 2.6 => [1, 2, 3] # 2.7 => #<Enumerator::Lazy: ...>
- チケット自体は
Enumerable::Lazy#with_index
もlazy
化してほしいというバグチケット- 内容的には
feature
っぽいが
- 内容的には
- この影響で既存の
Enumerable::Lazy#with_index
の挙動がぶっ壊れてしまったぽい - 上記のコードを Ruby 2.7 でも同じようにどうさせる場合は
#force
か#each
するのが無難かなあ
pp [1, 2, 3].lazy.with_index { |it, i| p [it, i] }.force pp [1, 2, 3].lazy.with_index.each { |it, i| p [it, i] }
- ちなみにこの変更、Ruby 2.7 の
NEWS
にも載ってなくてチケット調べるのに手間取りましたgit blame
で該当するコミットを調べるなどしていた- commit: https://github.com/ruby/ruby/commit/e94ac03eb0d07af3cbff20194acf479bf8851c39