加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby中的类可以使用@class_instance_variable而不是@@ class_var

发布时间:2020-12-17 03:38:55 所属栏目:百科 来源:网络整理
导读:我试图在定义这些对象的类中保持给定类的对象实例的计数. 首先我知道代码反射和ObjectSpace.each_object,但我不想使用反射,让类本身能够“照顾”自己. 我环顾四周,我发现的所有解决方案似乎都在类定义中使用了@@ class_variables,例如,这个问题的接受答案:H
我试图在定义这些对象的类中保持给定类的对象实例的计数.

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

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

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

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

来源&更多信息: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

我的一个疑问是,重写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

请注意,当比萨饼被垃圾收集时,Pizza.count不会下降,并且当它们被骗时它们不会上升.

回答你的其他问题:我不确定如何检查新方法,但它可能是用C语言编写的,所以你应该查看Ruby源代码.我认为它基本上是这样做的.

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

只要你在某个时候打电话给超级,你就可以逃脱压倒一切. (不是说这是一个好主意,但例如:

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

)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读