如何在不计算重新分配的情况下计算类的实例?

bhp*_*bhp 1 ruby methods class instances

我正在研究类方法。

我正在尝试计算一个类的创建实例的数量。我可以通过在initialize方法中创建一个计数器变量来做到这一点。

当我重新分配最初分配给一个类实例的变量时,就会出现问题。由于该initialize方法被调用两次,因此它无法识别该变量只是被重新分配给另一个类实例。

class Ticket
    attr_accessor :price
    attr_reader :event, :venue

    @@count = 0
    @@tickets = {}

    def initialize(event, venue)
        @event = event
        @venue = venue

        @@count += 1
    end

    def self.count
        @@count 
    end
end

a = Ticket.new("Michael Buble", "Staples")

a = Ticket.new("Frank Sinatra", "Madison Square Garden")

puts "Ticket count of #{Ticket.count}"
Run Code Online (Sandbox Code Playgroud)

当我在 IRB 中运行上述代码时,它给了我一个Ticket count of 2(如预期的那样)。如何更改我的代码以使其识别覆盖?

注意:我知道这个问题之前已经针对 Objective C 提出过,但是问题的重新分配方面为问题添加了不同的元素。否则请告诉我。

Bea*_*ech 7

ObjectSpace.each_object(Ticket).count
Run Code Online (Sandbox Code Playgroud)

将为您提供当前内存中对象的数量。在 IRB 中进行测试时,我发现它遇到了您描述的问题,即使您为变量分配了一个新对象,对象仍保留在内存中。从技术上讲,即使您将新实例分配给变量“a”,该对象仍然存在。

请参阅这篇文章:Deleting an object in Ruby答案中有大量关于您想要执行的操作的信息。