[Ruby] Class constant

Mikhail Yakshin greycat на altlinux.ru
Пн Мар 29 01:59:36 MSD 2004


Michael Shigorin пишет:

>>Как объявить константу в классе?
> 
> Почитать pickaxe book про class constants?  Кажется, это те, что
> начинаются с "@@". (лень смотреть :)

Class constants называются как раз те самые константы, которые я описал. 
Описываются они примерно так:

class Foo
   TYPE='Длинный текст'

   def bar
     puts TYPE
   end

end

Так вот. Если сделать

k = Foo.new
k.bar

то будет выведено нормально, аккуратно, нужный "Длинный текст".

А вот если просто сказать:

k.TYPE

то будет

NoMethodError: undefined method `TYPE' for ...

Понятно, что к такой константе можно обратиться, как к Foo::TYPE, но 
мне-то в данном случае хочется как раз наоборот. То есть у меня будет 
некий объект, я не знаю, какого именно класса, знаю только, что у этого 
класса обязательно будет константа TYPE и хочу ее значение получить. 
Можно, конечно, пойти по пути наименьшего сопротивления, сделать у 
класса метод, который будет эту константу возвращать. То есть что-то типа:

class Klass
   TYPE='Расширенное описание'
   def type
     TYPE
   end
end

k = Klass.new
k.type # >> 'Расширенное описание'

... но очень не хочется. Тем более, что, как я показывал в первом 
примере в этом треде - type хочется иметь у всех классов, 
понаследованных от базового.

Насчет @@ - это по-моему совсем мимо. С @@ начинаются class variables. 
То есть такие переменные, которые у присутствуют 1 на класс, вне 
зависимости от количества порожденных экземпляров этого класса, так, как 
если бы класс был singleton.

--
WBR, Mikhail Yakshin AKA GreyCat


Подробная информация о списке рассылки Ruby