Ruby类对象扩展

时间:2014-09-28 03:34:29

标签: ruby metaprogramming

我是Ruby的新手,我一直在努力学习元编程。我想定义一个类并计算创建的对象数,然后在调用ClassName.Count时将其打印出来。 (这将给出已创建的对象数)。 这就是我到目前为止所做的:

class Test
  @@number = 0

  def initialize
    @@number += 1
  end

  def self.Count
    puts "number is #{@@number}"
  end 
end 

Test.Count() # => 0

test1 = Test.new
test2 = Test.new
Test.Count() # => 2

test3 = Test.new
Test.Count() # => 3

这适用于打印正确数量的对象。但是,我应该使用类对象扩展来执行此操作,即不使用自身方法(self.foo)或类属性(@@number)。这是我被卡住的地方。我不确定我的解决方案和我需要实现的解决方案之间有什么区别。此外,对此主题的任何阅读建议都非常受欢迎。

2 个答案:

答案 0 :(得分:1)

你真的不应该使用"类变量" (例如@@foo);他们并不是大多数人认为的,他们的行为方式令人惊讶/愚蠢。在大多数情况下,当您认为需要一个"类变量"时,您真正需要的只是类本身的实例变量(作为对象,它是一个实例本身,类{{1} })。

我不知道你为什么不能定义单身方法(即#34;自我方法"),但这是另一种使用Class的方法语法。

class << self

答案 1 :(得分:1)

这是否符合您的要求?

class Test
  @count = 0
  def initialize
    Test.instance_variable_set(:@count, Test.instance_variable_get(:@count)+1)
  end
  def count
    Test.instance_variable_get(:@count)
  end
end

Test.instance_variable_get(:@count)
  #=> 0
test1 = Test.new
test1.count
  #=> 1
test2 = Test.new
test2.count
  #=> 2
test1.count
  #=> 2
Test.instance_variable_get(:@count)
  #=> 2