Как объявляются константы и какова их область видимости?ruby-5

Объявление констант

В Ruby константы начинаются с заглавной буквы. По соглашению, обычно используют UPPER_CASE стиль:

MY_CONSTANT = 100
PI = 3.14159
ApplicationName = "MyApp"

Важные особенности:

  1. Ruby позволяет изменять значение константы (с предупреждением):
    PI = 3.14
    PI = 3.14159  # Вызовет warning: already initialized constant PI
    
  2. Заморозка (freeze) делает константу действительно неизменяемой:
    COLORS = ['red', 'green', 'blue'].freeze
    COLORS << 'yellow'  # RuntimeError: can't modify frozen Array
    

Область видимости констант

1. Внутри классов и модулей

Константы принадлежат классу/модулю, где они объявлены:

class MyClass
  CONST = "value"

  def show_const
    CONST
  end
end

MyClass::CONST  # => "value"

2. Вложенные константы

Поддерживается пространство имен через вложенность:

module MyModule
  class InnerClass
    CONST = "inner"
  end
end

MyModule::InnerClass::CONST  # => "inner"

3. Лексическая область видимости

Ruby использует лексический поиск констант:

module A
  X = 1
end

module B
  X = 2
end

module A
  module B
    puts X  # => 1 (ищет сначала в A::B, потом в A)
  end
end

4. Глобальные константы

Определенные в Object доступны везде:

module Kernel
  RGB_COLORS = ['red', 'green', 'blue']
end

RGB_COLORS  # Доступна глобально

Методы работы с константами

  1. Проверка существования:

    MyClass.const_defined?(:CONST)
    
  2. Получение списка:

    MyClass.constants
    
  3. Удаление:

    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"

Резюмируем

  1. Константы начинаются с заглавной буквы, по соглашению UPPER_CASE
  2. Технически изменяемы, но с предупреждением (используйте freeze)
  3. Имеют лексическую область видимости
  4. Принадлежат классу/модулю, где объявлены
  5. Доступны через вложенные пространства имен (Module::Class::CONST)
  6. Наследуются, но могут быть переопределены
  7. Глобальные константы объявляются в Kernel или Object

Правильное использование констант делает код чище и поддерживаемее.