[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