Скажи, что у меня есть:

class MyClass
  MY_ENUM = [MY_VALUE_1 = 'value1', MY_VALUE_2 = 'value2']
end

Возможно что-то вроде этого:

p MyClass::MY_VALUE_1 #=> "value1"

Почему? Разве постоянная область видимости MY_VALUE1 и MY_VALUE_2 не находится внутри []?

3
anemaria20 27 Ноя 2016 в 17:16

3 ответа

Лучший ответ

Вы можете получить доступ к вложенной константе MY_VALUE_1, потому что она находится в той же области видимости, что и внешняя константа MY_ENUM: обе константы находятся в области действия класса MyClass.

Вы ожидали, что конструкция [...] определит новую область видимости, но это не так. В Ruby только три вещи определяют новую область видимости:

  • Определение класса с помощью class SomeName
  • Определение модуля с помощью module SomeName
  • Определение функции с помощью def some_name
3
Wayne Conrad 27 Ноя 2016 в 14:45

Литерал массива ([...]) не определяет область действия. Кажется, вам нужен хеш:

class MyClass
  MY_ENUM = {:MY_VALUE_1 => "value1", :MY_VALUE_2 => "value2"}
end 

MyClass::MY_ENUM[:MY_VALUE_1] #> value1
2
tokland 27 Ноя 2016 в 14:50

Если вы хотите предотвратить видимость за пределами класса (скрытие), вы можете использовать private_constant

private_constant :MY_VALUE_1
1
Axe 27 Ноя 2016 в 14:40