2011-10-12 23 views
0

在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 

现在我想实例化一个东西,没有它明确地分配给一个变量,而是在实例化时自动分配一个变量:

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

绝对不是。 – themirror

回答

2

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

问题浮现在脑海中:

  • 你只是想挽回按键吗?
  • 如果名称冲突(您连续拨打Thing.new("fred")两次)会发生什么?变量会发生什么变化?
  • 你真的想这样做吗,你真的想在它上面创建一个全局变量吗?剥离掉所有范围的安全性?
  • 如果这甚至是可能的,你可以挖掘垃圾收集器来做到这一点?

垃圾收集器自动(但只是周期性地)在没有对象存在引用时释放内存。似乎如果你这样做(为所有“事物”未分配创建变量),你会创建一个内存泄漏,并绕过垃圾收集器的生活目的。你也可能在与垃圾收集器对抗 - 也就是说,在你创建一个对象之后,如果垃圾收集器在那之间运行,并且当创建变量时,你仍然会丢失对象。

+0

我想搞乱垃圾收集器的工作方式不是实现OP目标的方法。 – themirror

+0

我认为这实际上是一个非常有趣的问题。出于好奇,你最初的目标是什么? – jefflunt