Подтвердить что ты не робот

Что такое определение класса внутри класса << self do?

Я знаю, как вы можете добавлять методы класса и поведение класса с помощью self << class (eigenclass). Но, прочитав некоторый исходный код, я увидел другое использование:

class LetterAvatar
  class << self
    class Identity
    end
  end
end

Как это работает? Что он делает и когда следует его использовать? Что может быть (возможно, более признанным) альтернативным способом написать это?

4b9b3361

Ответ 1

Я думаю, что они сделали это, потому что они не нуждались в этом классе где-либо еще.

Без открытия класса singleton поток будет выглядеть следующим образом (при условии, что каждый метод, определенный в метаклассе из исходного кода, будет иметь префикс с self.):

Они могли бы определить Identity как

class LetterAvatar
  class Identity
  end
end

а затем используйте класс в методе self.generate следующим образом:

class LetterAvatar
  # code omitted
  def self.generate
    identity = LetterAvatar::Identity.from_username(username)
    # code omitted
  end
  # other class level methods defined with `self.`
end

Но зачем это делать, если класс Identity фактически используется (и не должен быть доступен нигде) в одноэлементном классе (в generate)?

Решение IMO очень изящно, раньше ничего подобного не было.