Ruby: обнаружение неиспользуемых / неназначенных выражений - PullRequest
0 голосов
/ 13 октября 2011

В ruby, как я могу обнаружить неиспользуемые / неназначенные выражения и сделать с ними что-то вроде этого:

class Thing
  attr_accessor :name
  def initialize(name)
    @name = name

    #if a new instantiation of this class is not assigned to anything
    #or used by a calling method, then make a variable called #{name}
    #and assign it to this new instantiation
    if not assigned_or_used
      global_variable_set(name, this)
    end
  end

  def to_s
    "Hi from #{name}"
  end
end

Теперь я хочу создать экземпляр Thing без явного присвоения его переменной, а вместо этого иметь переменную, назначенную ему автоматически при ее создании:

bob = Thing.new("bob")
puts bob
#=> "Hi from bob"
#works ordinarily

Thing.new("fred")
puts fred
#=> "Hi from fred"
#works after implementing the code for instantiation of Thing
#without explicit assignment/use by a method

1 Ответ

2 голосов
/ 13 октября 2011

Да, я не знаю. Я мог бы неправильно понять, но это звучит как действительно плохая идея (возможно, вы можете привести конкретный пример , почему вы хотите это сделать).

Вопросы, которые приходят на ум:

  • Вы просто пытаетесь сохранить нажатия клавиш?
  • Что, если есть конфликт имен (вы делаете два вызова Thing.new("fred") подряд) - что происходит с переменной?
  • Вы действительно хотите это сделать, и действительно ли вы хотите создать глобальную переменную поверх нее, лишив все области безопасности?
  • Если это вообще возможно, можете ли вы покопаться в сборщике мусора, чтобы сделать это?

Сборщик мусора автоматически (но только периодически) освобождает память, когда не существует ссылок на объект. Похоже, что если бы вы сделали это (создав переменные для ВСЕХ «Неназначенных вещей»), то вы бы создали утечку памяти и обойдете цель сборщика мусора в жизни. Возможно, вы также будете бороться со сборщиком мусора, то есть сразу после создания объекта, если сборщик мусора будет работать между ними и при создании переменной, вы все равно потеряете объект.

...