gpt4 book ai didi

ruby - ruby 中的类可以使用@class_instance_variable 而不是@@class_variable 来存储实例化对象的数量吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:04 26 4
gpt4 key购买 nike

我正在尝试在定义这些对象的类中对给定类的对象实例进行计数。

首先我知道代码反射和 ObjectSpace.each_object,但我宁愿不使用反射并让类本身能够“照顾”自己。

我环顾四周,我发现的所有解决方案似乎都在类定义中使用了@@class_variables,例如,这个问题的公认答案:How to get class instances in Ruby?

虽然我一直在阅读,但我发现 ruby​​ 中的类变量在某些情况下可能表现得非常糟糕......最大的原因是:

A class variable defined at the top‐level of a program is inherited by all classes. It behaves like a global variable.

来源和更多信息在这里:http://ruby.runpaint.org/variables#class

因此,我尝试使用类实例变量而不是类变量来编写一个类,该类将其实例化对象的数量存储在自身内部,显然它似乎工作正常但因为我仍在学习这个“in-深”语言主题我想问你我写的代码是否正确和/或有意义:

class Pizza
@orders = 0
def self.new
@orders += 1
end
def self.total_orders
@orders
end
end

new_pizza = Pizza.new #=> 1
special_pizza = Pizza.new #=> 2
fav_pizza = Pizza.new #=> 3

我的一个疑问是,覆盖 Pizza.new 方法会“删除”原始 .new 方法的一些重要功能吗? (原始的 .new 方法提供了什么?我如何使用反射“检查”方法代码?)我还做错了什么,或者我的方法完全错了,为什么?

谢谢

编辑:忘记添加这个重要的部分:

作为一种更好地限制事物范围的方法,我希望 Pizza 类能够只在对象实例化时计数,而不是在它的 @instance 类变量上有一个 setter 方法,它可以在在代码中随时(Pizza.count = 1000)。这就是为什么我试图覆盖"new"。

我认为这是最棘手的部分,它让我问自己我的方法是否朝着正确的方向发展,或者我是否应该停止过多依赖这些语言机制,而是给自己添加一些逻辑,让计数仅在以下情况发生Pizza 类的对象已进入 ObjectSpace..

我只是在寻找更优雅、不臃肿的方式来使用语言特性来获得它..

无论哪种情况,我们都将不胜感激..

再次感谢。

最佳答案

您不需要覆盖新的。试试这个:

class Pizza
@count = 0
class << self
attr_accessor :count
end

def initialize
self.class.count += 1
end
end

Pizza.new
Pizza.new
puts Pizza.count

请注意,Pizza.count 在比萨被垃圾回收时不会下降,在被duped 时也不会上升。

回答您的其他问题:我不确定您如何检查 new 方法,但它可能是用 C 编写的,因此您应该查看 Ruby 源代码。我认为它基本上是这样做的。

def new(*args, &block)
o = allocate
o.initialize(*args, &block)
o
end

只要您在某个时候调用 super ,您就可以覆盖 new 。 (并不是说这是个好主意,而是举个例子:

class Foo
def self.new
# do whatever stuff you want here
super
end
end

)

关于ruby - ruby 中的类可以使用@class_instance_variable 而不是@@class_variable 来存储实例化对象的数量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12889509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com