[ruby-list:50868] Re: __id__ メソッドでの super について

From: Akret Node <node.akret@...>
Date: 2020-01-01 09:04:22 UTC
List: ruby-list #50868
のぐちです。

なにかすごい勘違いをしていたようです。アホな質問をしてすみません。

BasicObject クラスに対して __id__ メソッドを呼んでいるということは、探索は特異クラスに対して行われるんですね。

2.6.3 :001 > BasicObject.singleton_class.ancestors
 => [#<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]

特異クラスの継承関係のなかに自身(BasicObject)がいるので super を呼び出せるのですね。
もし理解に間違いがあれば指摘していただけると助かります。

失礼しました。

2020年1月1日(水) 17:36 Akret Node <node.akret@gmail.com>:
>
> ささださん
>
> お返事ありがたいです。
>
> BasicObject クラスは Class クラスのインスタンスであるから呼び出せるということでしょうか?
> super は原則、親クラスにある同名のメソッドを呼び出しますが、この場合は例外的に呼び出せるということでしょうか
>
> 次のプログラムを作ってみたのですが、期待通り5が表示されました。
>
> class Class
>   def sample
>     5
>   end
> end
>
> class String
>   def self.sample
>     super
>   end
> end
>
> p String.sample #=> 5
>
> 2020年1月1日(水) 15:00 Koichi Sasada <ko1@atdot.net>:
>
> >
> > ささだです。
> >
> > BasicObject クラスに対する __id__ を呼んでいるためです。
> >
> > p BasicObject.__id__
> > #=> 60
> >
> > p BasicObject.method(:__id__)
> > #=> #<Method: BasicObject.__id__() t.rb:2>
> >
> > p BasicObject.method(:__id__).super_method
> > #=> #<Method: BasicObject#__id__()>
> >
> > class BasicObject
> >    def __id__
> >      super
> >    end
> > end
> >
> > p BasicObject.__id__
> > #=> t.rb:18:in `__id__': super: no superclass method `__id__' for
> > BasicObject:Class (NoMethodError)
> >
> > On 2020/01/01 3:10, Akret Node wrote:
> > > のぐちです。
> > >
> > > あけましておめでとうございます。
> > >
> > > class BasicObject
> > >    def self.__id__
> > >      super
> > >    end
> > > end
> > >
> > > p BasicObject.__id__ #=> 47444468263960
> > >
> > > BasicObject には親クラスがないはずですが self.__id__ の中で super
> > > を読んでみると正しくオブジェクトIDが取得できているようです。これはどのような理屈で取得できているのでしょうか?
> > >
> > > 親クラスに同名のメソッドがなければ、「no superclass method `xxx' for 'yyy'」と例外になるはずですが、上記ではなりません。。。
> > >
> >
> > --
> > // SASADA Koichi at atdot dot net

In This Thread

Prev Next