2015-11-25 2 views
2

Я хочу определить переменную класса в одноэлементном классе. Я проверил результат этой программы:Как определить переменную класса в одноэлементном классе

class C 
    class << self 
    @@val = 100 
    end 
end 

C.singleton_class.class_variables #=> [], I expect [:@@val] 
C.class_variables #=> [:@@val] 

Я ожидаю, что объем @@val быть синглтон класс, не так ли?

Не могли бы вы рассказать мне, как определить переменную класса в одноэлементном классе, используя class << self, и почему эта программа неверна?

ответ

1

Чтобы установить переменный класс синглтона, можно использовать:

class C 
    class << self 
    class_variable_set :@@cv, 42 
    end 
end 
C.singleton_class.class_variables #⇒ [:@@cv] 
C.singleton_class.class_variable_get :@@cv #⇒ 42 
+0

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

+0

Чем больше я думаю об этом, тем больше я убежден, что это глюк рубинового парсера. Сфера действия - 'C.singleton_class', да. Даже «класс С; класс << self; класс << self; @@ ccv = 42; конец ; конец ; end' приводит к установке переменной класса на 'C'. Вероятно, это то, как обрабатываются '@' и '@@'. Он отвечает открытому классу, несмотря на то, появляется ли он внутри метода класса, метода экземпляра или любого объявления. – mudasobwa

+0

@CarySwoveland У меня есть это специально. – mudasobwa

Смежные вопросы