способ удалить глобальную переменную в Ruby?

#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 должна иметь точно такое же поведение, которое вы ожидаете от ее «сброса».