【发布时间】:2018-04-16 00:39:58
【问题描述】:
我在子类化和类变量方面有点挣扎。我期待子类的类方法调用设置的类变量特定于该子类,但我看到它们是在超类中设置的。
例如,如果我运行以下代码:
class Obj
@@can_say = []
def self.says word
@@can_say.push(word)
end
def self.listens_to calling
define_method calling do
"I say #{@@can_say}"
end
end
end
class Dog < Obj
says "woof"
says "bark bark"
listens_to "goodboy"
end
class Cat < Obj
says "meaow"
says "purr"
listens_to "lord"
end
cat = Cat.new
dog = Dog.new
puts("Dog: #{dog.goodboy}")
puts("Cat: #{cat.lord}")
我明白了:
ruby/test$ ruby test.rb
Dog: I say ["woof", "bark bark", "meaow", "purr"]
Cat: I say ["woof", "bark bark", "meaow", "purr"]
我期待:
ruby/test$ ruby test.rb
Dog: I say ["woof", "bark bark"]
Cat: I say ["meaow", "purr"]
有没有办法做到这一点?
【问题讨论】:
-
这是关于@@ vars 的一个非常普遍的误解......请参阅stackoverflow.com/questions/1251352/…
-
来自docs:“类变量在一个类、它的子类和它的实例之间共享。”
标签: ruby