Рубиновая константа в методе класса - PullRequest
8 голосов
/ 09 марта 2011
 class A
   class << self
     CONST = 1
   end
 end

 puts A::CONST    # this doesn't work

Есть ли способ получить доступ к константе извне класса с помощью этого вызова собственного класса?

Это эффективно делает это:

class A
    self.CONST = 1
end

Я понимаю, что я могу просто вывести константу из этого самовызова, чтобы легко решить эту проблему. Меня больше интересует внутренняя работа рубина.

Ответы [ 3 ]

4 голосов
/ 10 марта 2011

Ваша проблема в том, что вы ошиблись в значении кода.

class << self
  FOO = :bar
end

не эквивалентно self.FOO = :bar. Это очень отличается от этого. Это эквивалентно self.singleton_class.const_set(:FOO, :bar).

Я думаю, вы предполагаете, что class << self означает «предположим, что есть неявное« я »перед всем, что я здесь пишу» или что-то в этом роде »(возможно, вы думаете об утверждении JavaScript with). Что он на самом деле делает, так это помещает нас в контекст одноэлементного класса self, особого класса, единственным экземпляром которого является текущий объект. Итак, вы определяете константу в синглтон-классе объекта.

Чтобы определить константу в классе, вы просто пишете:

class Something
  FOO = :bar
end
4 голосов
/ 09 марта 2011

Не совсем то, что вы хотели, но вы просто не определили CONST внутри класса A, но в его метаклассе, поэтому я сохранил ссылку на ...

class A
  class << self
    ::AA = self
    CONST = 1
  end
end
puts AA::CONST
1 голос
/ 10 марта 2011

Также, вероятно, не совсем то, что вы хотели, поскольку вы ссылаетесь на класс A в метаклассе A (что кажется обманом), но это немного более кратко.

 class A
   class << self
     A::CONST = 1
   end
 end

Для глубокого понимания того, что происходит в этом посте, достаточно информативно http://www.klankboomklang.com/2007/10/05/the-metaclass/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...