#ruby #global-variables
#ruby #глобальные переменные
Вопрос:
Я знаю, что могу просмотреть все глобальные переменные через Kernel#global_variables, но есть ли какой-либо метод для их удаления, похожий на методы remove_instance_variable, remove_class_variable, remove_const? Или есть способ использовать их для достижения той же цели?
Комментарии:
1. Я так не думаю. (Зачем вам это нужно?)
2. Вы можете присвоить ей
nil
значение. Но, как и в комментариях, зачем вам определять и удалять глобальную переменную? Следует избегать глобальных переменных, поскольку они могут быть переопределены из любого места кода. Если вам приходится их использовать, используйте их с особой осторожностью.3. Из-за задержек gc ObjectSpace#define_finalizer может быть недостаточно быстрым, чтобы узнать, когда переменная больше не ссылается на объект. Kernel#trace_var, единственный обратный вызов, который запускается при изменении переменной, работает только с глобальными значениями
4. и иногда использование функции setter непрактично или невозможно по многим причинам
Ответ №1:
Я не верю, что возможно «сбросить» глобальную переменную. Лучше всего установить для переменной значение nil
.
Обычно, когда вы пытаетесь использовать переменную, которую вы еще не определили, Ruby выдает ошибку.
irb > "The following variable has not yet been defined: #{a}"
irb > NameError: undefined local variable or method `a' for main:Object
Это поведение на самом деле отличается от глобальных переменных. Любая попытка вызвать глобальную переменную, которая не была определена, вернет результат nil
.
irb > "The following global variable has not yet been defined: #{$a}"
# => The following global variable has not yet been defined:
irb > $a.class
# => NilClass
Таким образом, установка вашей глобальной переменной значения nil должна иметь точно такое же поведение, которое вы ожидаете от ее «сброса».