Об определении класса в Ruby - PullRequest
0 голосов
/ 27 октября 2011

Недавно я изучил некоторые подробности о классах в 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 </strong> меняет текущий объект и контекст?

И еще один вопрос.Насколько я знаю, все объекты Class подчиняются шаблонам проектирования, таким как муха, так как они совместно используют один и тот же объект Class с одинаковым определением.Тогда собственный класс стал запутанным.Так как def в собственном классе на самом деле определяет метод с объектом Class, как он может быть связан с «def self. *»?

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

1 Ответ

4 голосов
/ 27 октября 2011
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 - класс."

...