Project

General

Profile

Bug #3154

Hidden allocate, new and superclass methods on 1.9.2

Added by ujihisa (Tatsuhiro Ujihisa) over 9 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
Target version:
-
ruby -v:
1.8.8
[ruby-dev:40996]

Description

=begin
ruby 1.9.2から、あるクラスに対してどのその親クラスからもallocate new superclassの3つのメソッドがpublic_methods(false)の一覧に出てこなくなったのですが、これは意図的な仕様変更なのでしょうか。

 $ ruby192 -ve 'class A; end; A.ancestors.map {|i| p [i, i.public_methods(false).sort] }'
 ruby 1.9.2dev (2010-04-02 trunk 27162) [i386-darwin9.8.0]
 [A, []]
 [Object, []]
 [Kernel, [:Array, :Complex, :Float, :Integer, :Rational, :String, :__callee__, :__method__, :`, :abort, :at_exit, :autoload, :autoload?, :binding, :block_given?, :caller, :catch, :eval, :exec, :exit, :exit!, :fail, :fork, :format, :gets, :global_variables, :iterator?, :lambda, :load, :local_variables, :loop, :open, :p, :print, :printf, :proc, :putc, :puts, :raise, :rand, :readline, :readlines, :require, :require_relative, :select, :set_trace_func, :sleep, :spawn, :sprintf, :srand, :syscall, :system, :test, :throw, :trace_var, :trap, :untrace_var, :warn]]
 [BasicObject, []]

RubySpecを修正していてこの変更に気がつきました。ChangeLogや差分やメーリングリストの過去ログやRedMineを見たもののどの部分でどのような意図でこの変更がなされたのか分からなかったため、ここで質問させてください。

これが意図しない変更であった場合、自クラスとその全ての親クラスのpublic_methodsやsingleton_methodsに挙げられていないにも関わらずパブリックに呼び出せるメソッドがあるのは、ちょっと不思議な挙動のように感じます。
=end

History

#1

Updated by mame (Yusuke Endoh) over 9 years ago

=begin
遠藤です。

2010年4月16日7:24 ujihisa . redmine@ruby-lang.org:

ruby 1.9.2から、あるクラスに対してどのその親クラスからもallocate new superclassの3つのメソッドがpublic_methods(false)の一覧に出てこなくなったのですが、これは意図的な仕様変更なのでしょうか。

すみません、実は以前から認識していて、直さなきゃなーとは思って
ました。

前に調べた時は [ruby-core:28837] [Bug #2993] のための r27085 に
よる影響との自分内結論でした。
[ruby-core:28837] は instance_methods を修正することを意図して
いたため、public_methods に影響が出たのは意図はしていなかったと
思います。

それでもなぜ報告していなかったかというと、これは元々の方がバグ
だったと思われるためです。

これが意図しない変更であった場合、自クラスとその全ての親クラスのpublic_methodsやsingleton_methodsに挙げられていないにも関わらずパブリックに呼び出せるメソッドがあるのは、ちょっと不思議な挙動のように感じます。

public_methods(true) ならちゃんと出てくるので問題ないです。

$ ./ruby -e 'class A; end; p A.public_methods(true).sort.grep(/super/)'
[:superclass]

public_methods(false) は A に直接所属するメソッド一覧を得ます
が、superclass たちは Class に所属するため、出てこなくて正常
です。
1.public_methods(false) に floor は出てきませんが、1.floor が
動くのと同じです (Numeric#floor) 。

というわけで、rubyspec 側を修正しといてもらえますでしょうか。
1.8 に backport されるかどうかは、卜部さんや knu さんに聞いて
ください。

--
Yusuke ENDOH <mame@tsg.ne.jp
=end

#2

Updated by mame (Yusuke Endoh) over 9 years ago

  • Status changed from Open to Rejected

=begin

=end

#3

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

  • Category set to core
  • Status changed from Rejected to Assigned
  • Assignee set to knu (Akinori MUSHA)
  • ruby -v set to 1.8.8

=begin

=end

Updated by knu (Akinori MUSHA) over 8 years ago

  • Status changed from Assigned to Closed

残念ですがもう1.8はこのままです。

Also available in: Atom PDF