Ruby:检测未使用/未分配的表达式

时间:2011-10-12 21:47:52

标签: ruby variable-assignment

在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 个答案:

答案 0 :(得分:2)

是的,我不知道。我可能会误解,但这听起来像是一个非常糟糕的主意(也许你可以提供为什么你想要这样做)的具体例子。

想到的问题:

  • 你只是想节省按键吗?
  • 如果存在名称冲突(您连续两次调用Thing.new("fred"))该怎么办?变量会发生什么变化?
  • 你真的想这样做,你真的想在它上面创建一个全局变量,剥夺所有范围的安全性吗?
  • 如果这是可能的,你可以深入垃圾收集器吗?

垃圾收集器会自动(但只是定期)在没有对象存在引用时释放内存。看起来如果你这样做(为所有“事物”未分配创建变量)你将创建内存泄漏,并绕过垃圾收集器的生活目的。您也可能正在与垃圾收集器作斗争 - 这意味着,在您创建对象之后,如果垃圾收集器在此之间运行,并且在创建变量时,您仍然会丢失该对象。