Об определении класса в Ruby

Недавно я изучал некоторые детали классов в Ruby и был сбит с толку определением класса.

В Ruby определение класса выглядит следующим образом:

class A
    def self.my_method
    end
end

и это то же самое, что и

class A
    class << self
        def my_method
        end
    end
end

тогда я был сбит с толку. В первом случае self можно рассматривать как указатель на объект, который в данный момент используется, а текущий класс контекста - A. И поиск метода выполняется рекурсивно. Но у меня вопрос: что делает def? Как он меняет текущий объект и контекст? Проблема такая же для 2-го случая. Как такое описание, как class ‹< self, изменяет текущий объект и контекст?

И еще вопрос. Насколько мне известно, все объекты Class подчиняются шаблонам проектирования, таким как fly-weight, поскольку они используют один и тот же объект Class с одинаковым определением. Затем собственный класс запутался. Поскольку def в собственном классе фактически определяет метод с объектом Class, как это может быть связано с def self. *?

Снаружи это выглядит слишком сложным, и мне могут понадобиться детали дизайна Ruby.


person Davidsun    schedule 27.10.2011    source источник
comment
на самом деле я вас не понимаю ... self - это экземпляр класса singleton, поэтому 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

Собственный класс на самом деле является экземпляром класса, у него тоже есть собственный класс.

«Если это кажется слишком запутанным, просто помните, что Class - это объект, а Object - это класс».

person Guilherme Bernal    schedule 27.10.2011
comment
Последнее предложение меня вдохновило. Спасибо! - person Davidsun; 28.10.2011