jj_*_*jj_ 4 ruby counter instances class-variables class-instance-variables
我试图在定义这些对象的类中保持给定类的对象实例的计数.
首先我知道代码反射和ObjectSpace.each_object,但我不想使用反射,让类本身能够"照顾"自己.
我环顾四周,我发现的所有解决方案似乎都在类定义中使用了@@ class_variables,例如,这个问题的接受答案:如何在Ruby中获取类实例?
虽然我一直在阅读,但我发现ruby中的类变量在某些情况下表现得非常糟糕......最大的原因是:
在程序顶层定义的类变量由所有类继承.它的行为类似于全局变量.
来源及更多信息:http://ruby.runpaint.org/variables#class
所以,我尝试使用类实例变量而不是类变量来编写一个存储其实例化对象数量的类,显然它似乎工作正常但是因为我仍然在学习这种"深入的"语言主题我想问你我写的代码是否正确和/或有意义:
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
Run Code Online (Sandbox Code Playgroud)
我的一个疑问是,重写Pizza.new方法我"删除"原始.new方法的一些重要功能?(原始的.new方法提供了什么?我如何使用反射"检查"方法代码?)我还做错了什么,或者我的方法完全错误,为什么?
谢谢
编辑:忘了添加这个重要的一点:
作为一种更好地约束事物范围的方法,我希望Pizza类能够只计算对象实例化时间,而不是在其@instance类变量上有一个setter方法,可以在代码中随时访问它(Pizza.count = 1000).这就是我试图覆盖"新"的原因.
我认为这是最棘手的部分让我问自己我的方法是在正确的方向,或者我是否应该停止对这些语言机制的反应如此之多,而是添加一些逻辑来让计数只在一个对象发生时发生一个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
Run Code Online (Sandbox Code Playgroud)
请注意,Pizza.count当比萨饼被垃圾收集时不会下降,并且当它们被dup编辑时它不会上升.
回答你的其他问题:我不确定如何检查new方法,但它可能是用C编写的,所以你应该查看Ruby源代码.我认为它基本上是这样做的.
def new(*args, &block)
o = allocate
o.initialize(*args, &block)
o
end
Run Code Online (Sandbox Code Playgroud)
只要你super在某个时候打电话,你就可以逃脱压倒一切.(不是说这是一个好主意,但例如:
class Foo
def self.new
# do whatever stuff you want here
super
end
end
Run Code Online (Sandbox Code Playgroud)
)
| 归档时间: |
|
| 查看次数: |
4213 次 |
| 最近记录: |