2021/02/04 今週の気になった bugs.ruby のチケット

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

[Bug #10593] Emoji is been considered as comment

#️⃣ これはコメントアウトです
#️⃣ Ruby のコードは実行されません
puts "hello, 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_indexRuby 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_indexlazy 化してほしいというバグチケット
    • 内容的には 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] }