Относно дефинирането на клас в Ruby

Наскоро проучвах някои подробности относно класовете в Ruby и бях объркан от дефиницията на класа.

В Ruby дефиницията на класа е следната,

class A
    def self.my_method
    end
end

и е същото като

class A
    class << self
        def my_method
        end
    end
end

тогава се обърках. За първия случай self може да се разглежда като указател към текущо използван обект, а текущият клас на контекста е A. И търсенето на метода се извършва рекурсивно. Но въпросът ми е какво прави def? Как променя текущия обект и контекст? Проблемът е същият и за втория случай. Как описанието като class ‹‹ self променя текущия обект и контекст?

И още един въпрос. Доколкото ми е известно, всички Class обекти се подчиняват на дизайнерски модели като fly-weight, тъй като споделят един и същ Class обект с една и съща дефиниция. Тогава собственият клас стана объркващ. Тъй като def в eigenclass всъщност дефинира метод с обект Class, как може да бъде свързан с "def self.*"?

Изглежда твърде сложно отвън и може да се нуждая от детайлите на дизайна на Ruby.


person Davidsun    schedule 27.10.2011    source източник
comment
всъщност не разбирам вашето объркване... self е екземплярът на единичен клас, така че def self.foobar декларира метод на клас, докато def foobar декларира методи на екземпляр, в който self е текущият екземпляр. колкото до твоите случаи...не трябва ли и двата да са еднакви? (вие декларирате методи на клас)   -  person robustus    schedule 27.10.2011
comment
Може би това помага: stackoverflow.com/questions/1630815/   -  person Daniel Rikowski    schedule 27.10.2011


Отговори (1)


class A
  # self here is A
  def aa
    # self here is the instance of A who called this method
  end
  class << self
    # self is the eigenclass of A, a pseudo-class to store methods to a object.
    # Any object can have an eigenclass.
    def aa
      # self is the pseudo-instance of the eigenclass, self is A.
    end
  end
end

Това е същото:

class A
  def self.aa
  end
end

И този:

class << A
  def aa
  end
end

А също и това:

def A.aa
end

Можете да отворите собствения клас на всичко:

hello = "hello"
class << hello
  def world
    self << " world"
  end
end
hello.world #=> "hello world"
"my".world  #=> NoMethodError

Един eigenclass всъщност е екземпляр на Class, той също има свой собствен eigenclass.

„Ако изглежда твърде объркващо, просто не забравяйте, че Class е обект и че Object е клас.“

person Guilherme Bernal    schedule 27.10.2011
comment
Последното изречение ме вдъхнови. Благодаря! - person Davidsun; 28.10.2011