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)
- https://bugs.ruby-lang.org/projects/ruby-master/repository/git/revisions/71c746379d5872e250d90ae45c585760afaf9516 が原因で壊れたらしい
- 修正 PR: https://github.com/ruby/ruby/pull/5592
[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#+@
String#-@
や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
が-@
の代替として利用できるんじゃない?とコメントされていて議論が進んでいる