2022/02/24 今回の気になった bugs.ruby のチケット

今週はアクセシビリティ関連のバグ報告がありました。

[Bug #18600 ] Aliased method visibility issue on Ruby 3.1

  • 次のように親のメソッドを public にしてからalias_method すると private に戻ってしまっているというバグ報告
module M
  private def private_meth; end
end

class X
  include M

  public :private_meth
  alias_method :public_meth, :private_meth
  alias_method :private_meth, :public_meth
end

x = X.new

p x.respond_to?(:private_meth)
# Ruby 3.0.0 => true
# Ruby 3.1.0 => false

x.private_meth
# Ruby 3.0.0 => OK
# Ruby 3.1.0 => NG: private method `private_meth' called for #<X:0x00007fd46bca92b0> (NoMethodError)

[Feature #18594] Add a #to_h method on URI::Generic

  • 以下のように uri に対して Hash に変換するメソッドを追加する提案
require "uri"

uri = ::URI.parse("https://example.com")

pp uri.component
# => [:scheme, :userinfo, :host, :port, :path, :query, :fragment]
pp uri.select(*uri.component)
# => ["https", nil, "example.com", 443, "", nil, nil]

# こういうような Hash を返すメソッドを追加する提案
pp [uri.component, uri.select(*uri.component)].transpose.to_h
# => {:scheme=>"https", :userinfo=>nil, :host=>"example.com", :port=>443, :path=>"", :query=>nil, :fragment=>nil}

[Feature #16295] Chainable aliases for String#-@ and String#+@

# これは -("foo".size) と同じ意味になる
-"foo".size
# => -3

# 本来はこういう挙動を期待する
(-"foo").size
# => 3
  • なので次のようなコードはエラーになってしまう
# error: undefined method `+@' for false:FalseClass (NoMethodError)
+[1, 2, 3].to_s.frozen?
  • このチケットでは以下のようにチェーンできるようにすることを議論している
# -@ や +@ をメソッド呼び出しのようにする
"foo".-.size
ary.to_s.+.frozen?

# もしくは -@ や +@ と同等の名前付きのメソッドを別に用意する
"foo".dedup.sizたのむかねもなかったe
ary.to_s.mutable.frozen?
"foo".-@.size
# => 3

[1, 2, 3].to_s.+@.frozen?
# false
  • 色々と議論されているんですが以下のチケットに派生している

[Feature #18595] Alias String#-@ as String#dedup

  • [Feature #16295] からの派生
  • String#-@エイリアスとして String#dedup を追加する提案
  • String#+@ に関しては String#dup で代替できるのでこのチケットでは -@ について議論されている
  • 現状は String#freeze-@ の代替として利用できるんじゃない?とコメントされていて議論が進んでいる