【问题标题】:Replace variable value on method call在方法调用上替换变量值
【发布时间】:2012-12-05 15:07:17
【问题描述】:

假设我有以下课程:

class MyClass

  @@instances = []
  def initialize
    @@instances << self
  end#def

  def delete
    @@instances.delete(self)
    #what now??
    self.replace nil #doesn't do the trick
  end#def

end#class

我想做以下事情:

o = MyClass.new
o.delete

o 在执行delete 时将变为nil。有什么想法吗?

【问题讨论】:

  • 这是不可能的:您只能修改对象本身,而不是 o,它是对其的引用,并且无法通过 delete 方法访问。

标签: ruby variables methods


【解决方案1】:

如果你想得到MyClass的所有实例的数组,你需要做的就是

ObjectSpace.each_object(MyClass).to_a

如果您想销毁MyClass 的实例o,因为o 没有在其他任何地方引用,那么让o 引用其他内容

o = nil

稍后,该对象将被垃圾回收。

【讨论】:

    【解决方案2】:

    正如上面的尤里卡指出的那样,这是不可能的。但是,您可以实现类似的语义:

    class MyClass
      def delete
        ....
        is_deleted
      end
    
      def is_deleted
         check_some_conditions
      end
    end
    

    那么,你的语法是:

    o = MyClass.new
    if o.delete.is_deleted
      ...
    end
    

    您也可以覆盖nil?,但我不建议这样做,因为它可能会使使用您的代码的人感到困惑。

    【讨论】:

    • @user1130886 什么意思?
    • 抱歉,刚习惯在 StackOverflow 上写 cmets。以为我在写答案而不是评论
    【解决方案3】:

    一种可能是:

    vars = Kernel.global_variables + Kernel.local_variables
    vars.map{|var| var=nil if var == self}
    

    但是,我不认为这是一个聪明的...

    编辑:不,一点也不聪明

    【讨论】:

    • 非常有趣。但是,仍然存在对该对象的引用,即使内核不知道它,即在执行上下文中。
    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多