您可以创建类的实例变量,并将其访问者定义为该类的单例方法。
但像@@var
这样的类变量表现得很奇怪,尤其是在继承时。它有用例吗?
答案 0 :(得分:4)
我将你的意思解释为奇怪,因为类变量在每个类之间没有不同,但在类的继承层次结构中是共享的。
正如你所提到的,并且在JörgWMittag对this question的回答中也指出,你想要一个变量与一个类一致但在类之外不同,那么你可以使用一个类实例变量那个班。这意味着,类变量的行为应该与它有任何理由存在的行为不同。并且类变量确实在继承层次结构中的类之间共享。
class A
@@foo = 3
end
class B < A
puts @@foo
end
# => 3
当您想要共享层次结构中的类共有的内容时,它可能很有用。例如,假设您在类中具有一些将在继承此类的类中使用的功能。假设该功能依赖于某个参数,并且您希望该参数更改在继承该功能的类之间保持一致。然后,类变量将很有用。
例如,假设您有这种方法:
class Array
def join_with_delimiter
join(@@delimiter)
end
end
class A < Array; end
通过设置@@delimiter
一次,您可以预期Array
和A
的行为一致。
class Array; @@delimiter = "*" end
Array.new([:a, :b, :c]).join_with_delimiter # => "a*b*c"
A.new([:a, :b, :c]).join_with_delimiter # => "a*b*c"
class A; @@delimiter = "#" end
Array.new([:a, :b, :c]).join_with_delimiter # => "a#b#c"
A.new([:a, :b, :c]).join_with_delimiter # => "a#b#c"
如果使用类实例变量执行此操作,则不会获得一致的行为:
class Array
def self.delimiter; @delimiter end
def join_with_delimiter
join(self.class.delimiter)
end
end
class A < Array; end
class Array; @delimiter = "*" end
Array.new([:a, :b, :c]).join_with_delimiter # => "a*b*c"
A.new([:a, :b, :c]).join_with_delimiter # => "abc"
class A; @delimiter = "#" end
Array.new([:a, :b, :c]).join_with_delimiter # => "a*b*c"
A.new([:a, :b, :c]).join_with_delimiter # => "a#b#c"
答案 1 :(得分:0)
类变量用于将值传递给类中的不同方法。