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

From: Akret Node <node.akret@...>
Date: 2020-01-01 08:36:22 UTC
List: ruby-list #50867
ささださん

お返事ありがたいです。

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