Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从仅从该数组/哈希引用的数组/哈希中删除对象 是否可以从仅从此数组/哈希引用的数组/哈希中删除对象?_Ruby_Object Reference - Fatal编程技术网

Ruby 从仅从该数组/哈希引用的数组/哈希中删除对象 是否可以从仅从此数组/哈希引用的数组/哈希中删除对象?

Ruby 从仅从该数组/哈希引用的数组/哈希中删除对象 是否可以从仅从此数组/哈希引用的数组/哈希中删除对象?,ruby,object-reference,Ruby,Object Reference,我正在寻找的示例: some_array.reject!{|elm| ObjectSpace.only_one_reference_to?(elm)} 我正在制作一个脚本,它在内存中似乎正在快速增长。其原因是一个长期存在的数组,它可以在事件周围保留过时的对象,尽管它不需要这样做 问题主要在于: @@long_living_array = [] class Foo def initialize @@long_living_array << self e

我正在寻找的示例:

some_array.reject!{|elm| ObjectSpace.only_one_reference_to?(elm)}
我正在制作一个脚本,它在内存中似乎正在快速增长。其原因是一个长期存在的数组,它可以在事件周围保留过时的对象,尽管它不需要这样做

问题主要在于:

@@long_living_array = []
class Foo
    def initialize
        @@long_living_array << self
    end
end

a = Foo.new()
b = Foo.new()
a = nil
#Here is the problem, a sticks around in @@long_living_array, even though it does not really need to be there.

我发现它似乎做了一些类似的事情,但它是Ruby本身的补丁(一些C文件),因此我不可能使用它。

您可以存储一个对象,而不是存储对象本身。它允许对引用的对象进行垃圾收集:

require 'weakref'

@@long_living_array = []

class Foo
  def initialize
    @@long_living_array << WeakRef.new(self)
  end
end

a = Foo.new
b = Foo.new
@@long_living_array.count
#=> 2

a = nil                                       # reassign 'a'
GC.start                                      # start the garbage collector
@@long_living_array.keep_if(&:weakref_alive?) # remove GC'ed objects

@@long_living_array.count
#=> 1
需要“weakref”
@@长寿命数组=[]
福班
def初始化
@@长寿数组2
a=零#重新分配“a”
GC.start#启动垃圾收集器
@@长寿命数组。如果(&:weakref#u活着,请保持?)#移除GC'ed对象
@@long_living_array.count
#=> 1

weakref的好用例。酷!我会尽快尝试这个!
require 'weakref'

@@long_living_array = []

class Foo
  def initialize
    @@long_living_array << WeakRef.new(self)
  end
end

a = Foo.new
b = Foo.new
@@long_living_array.count
#=> 2

a = nil                                       # reassign 'a'
GC.start                                      # start the garbage collector
@@long_living_array.keep_if(&:weakref_alive?) # remove GC'ed objects

@@long_living_array.count
#=> 1