Project

General

Profile

Actions

Bug #3154

closed

Hidden allocate, new and superclass methods on 1.9.2

Added by ujihisa (Tatsuhiro Ujihisa) over 14 years ago. Updated over 13 years ago.

Status:
Closed
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

Actions #1

Updated by mame (Yusuke Endoh) over 14 years ago

=begin
遠藤です。

2010年4月16日7:24 ujihisa . :

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 <
=end

Actions #2

Updated by mame (Yusuke Endoh) over 14 years ago

  • Status changed from Open to Rejected

=begin

=end

Actions #3

Updated by nobu (Nobuyoshi Nakada) over 14 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 13 years ago

  • Status changed from Assigned to Closed

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0