Unexpected behavior of Ruby eigenclass

First, add the eigenclass method "copied from this blog post "

class Object 
  def eigenclass 
    class << self
      self
    end 
  end 
end

Then create a simple class

class A
end

puts A.new.eigenclass.superclass      # => A
puts Class.new.eigenclass.superclass  # => #<Class:Object>

I was expecting the second puts to issue Class

Any clue why this happened?

+4
source share
3 answers

From this blogpost you can build a similar diagram:

                        +------------------+               +-------------------+
                        |      Object      |- eigenclass ->| Object eigenclass |
                        +------------------+               +-------------------+
                                 ^                                   ^             
                                 | superclass             superclass |                                                     
                        +------------------+               +-------------------+
                        |        A         |- eigenclass ->|    A eigenclass   |
                        +------------------+               +-------------------+
                                 ^
                                 | superclass
+-------+               +------------------+                                   
| A.new |- eigenclass ->| A.new.eigenclass |                                   
+-------+               +------------------+    

Trying to find a superclass of class e from an instance of A shows that it points to a class A.

A.new.eigenclass.superclass      # => A                               

Class.newreturns an instance of the Class object, i.e. new class. This is a class, like a class A.

Class.new.class # => Class
A.class         # => Class

Superclass and class. The superclass is implicit Object.

Class.new.superclass # => Object
A.superclass         # => Object

- Object, eigenclass - eigenclass.

Object.eigenclass                            # => #<Class:Object>
A.eigenclass.superclass                      # => #<Class:Object>
A.eigenclass.superclass == Object.eigenclass # => true

, eigenclass Class.new Object eigenclass

Class.new.eigenclass.superclass              # => #<Class:Object>

Class.new A.new , Class.new , A.new .

Class.new.new # => #<#<Class:0x007f86b50d8f70>:0x007f86b50d8f20>
A.new.new     # => NoMethodError: undefined method `new' for #<A:0x007f86b50cbf50>
+4

puts A.new.eigenclass.superclass #eigenclass A. , , eigenclass, , .

:

EigenClass - , , .

, obj = Foo.new :

obj --eigenclass β†’ # > - () β†’ A

:

obj - () β†’ A

self #eigenclass.

, Ruby, - . , #eigenclass eigenclass A ( sigleton).

A - (eigenclass) β†’ # - () β†’ #

, # A, , Ruby , eigenclasses . :

A.superclass #=> Object   
A.eigenclass #=> #<Class: A>   
A.eigenclass.superclass #=> #<Class: Object> => Eigenclass of Object   
A.eigenclass.superclass == Object.eigenclass #=> true   

eigenclass .

, : Class.new.eigenclass.superclass, . Class.new , B, eigenclass.superclass . B Object, B B.

. , ; . ( Pragmatic MR): Shot from Pragmatic MR.

, , D C. , D.eigenclass.superclass eigneclass ( D) [ C]. C - Object.. , , .

+5

eigenclass , eigenclass Class. , . , def Numeric.kind_of_number?() true end, , Fixnum.kind_of_number? . eigenclass Fixnum eigenclass.

+1
source

Source: https://habr.com/ru/post/1543139/


All Articles