В Ruby константы начинаются с заглавной буквы. По соглашению, обычно используют UPPER_CASE стиль:
MY_CONSTANT = 100
PI = 3.14159
ApplicationName = "MyApp"
Важные особенности:
PI = 3.14
PI = 3.14159 # Вызовет warning: already initialized constant PI
COLORS = ['red', 'green', 'blue'].freeze
COLORS << 'yellow' # RuntimeError: can't modify frozen Array
Константы принадлежат классу/модулю, где они объявлены:
class MyClass
CONST = "value"
def show_const
CONST
end
end
MyClass::CONST # => "value"
Поддерживается пространство имен через вложенность:
module MyModule
class InnerClass
CONST = "inner"
end
end
MyModule::InnerClass::CONST # => "inner"
Ruby использует лексический поиск констант:
module A
X = 1
end
module B
X = 2
end
module A
module B
puts X # => 1 (ищет сначала в A::B, потом в A)
end
end
Определенные в Object доступны везде:
module Kernel
RGB_COLORS = ['red', 'green', 'blue']
end
RGB_COLORS # Доступна глобально
Проверка существования:
MyClass.const_defined?(:CONST)
Получение списка:
MyClass.constants
Удаление:
MyClass.send(:remove_const, :CONST)
Классы наследуют константы от родителя:
class Parent
CONST = "parent"
end
class Child < Parent
end
Child::CONST # => "parent"
Но можно переопределить:
class Child < Parent
CONST = "child"
end
Parent::CONST # => "parent"
Child::CONST # => "child"
Правильное использование констант делает код чище и поддерживаемее.