2021/10/14 今回の気になった bugs.ruby のチケット

今週は feature チケットに関するトリアージガイドラインの提案などがありました。

[Bug #18250] Anonymous variables seem to break Ractor.make_shareable

  • 以下のようなコードを実行すると Ractor.make_shareableTypeError が発生するというバグ報告
def foo(*); ->{ super };end
# error: `make_shareable': wrong argument type false (expected Symbol) (TypeError)
Ractor.make_shareable(foo) # expected Symbol
  • TypeError ではなくて Ractor::IsolationError が発生するのが期待する挙動らしい
  • ちなみに Ractor.make_shareable は Ractor 間でオブジェクトを使用するために引数を不変にするメソッド
  • #freeze とは違ってネストしてオブジェクトを freeze する
# freeze は配列の中身までは freeze しない
ary = [{ a: 1, }, { b: 2 }]
ary.freeze
pp ary.frozen?      # => true
pp ary[0].frozen?   # => false
pp ary[1].frozen?   # => false

# freeze は配列の中身までは freeze しない
ary = [{ a: 1, }, { b: 2 }]
Ractor.make_shareable(ary)
pp ary.frozen?      # => true
pp ary[0].frozen?   # => true
pp ary[1].frozen?   # => true

[Bug #18246] send does not work for unary ! operator when operator isn't a literal symbol

  • ! 単項演算子send で呼び出すとエラーになるというバグ報告
# これは + 二項演算子を呼ぶ
1.send(:+, 2)    # => 3
1.send(:"+", 2)  # => 3

# これは - 単項演算子を呼ぶ
1.send(:-@)   #=> -1
1.send(:"-@") #=> -1

# これは ! 単項演算子を呼び出してほしい
false.send(:!@)   #=> true
# error: undefined method `!@' for false:FalseClass (NoMethodError)
false.send(:"!@")
  • これは期待する挙動で ! 単項演算子を呼び出す場合は ! メソッド名で呼び出す必要がある
    • false.send(:"!") # => true
  • 逆に false.send(:!@) がなぜ動くのかと言うと :!@:! になるので false.send(:!) と同じ意味になるから
p :!@     # => :!
p :"!@"   # => :"!@"
  • 知らんかった

[Misc #18248] Add Feature Triaging Guide

Rubyは2019年6月にバグトリアージガイドを追加しましたが、それ以降はそれを使ってトラッカーのオープンバグを1400以上から300程度まで減らしました。Rubyでは現在、課題トラッカーに1200以上のオープンな機能リクエストがあります。ざっと見たところ、これらの多くはすでに実装されており、多くは望まれていないと思われます。私はRubyに機能トリアージガイドを追加し、機能リクエストのトリアージを開始したいと考えています。オープンな機能リクエストは、まだ実装されていない機能のうち、Rubyコアチームが実装を希望したり、パッチを検討したりするものを目標としています。そうすることで、潜在的Rubyへの貢献者が、自分ができる貢献の可能性を簡単に知ることができるようになります。