类变量的用例

时间:2013-01-06 07:09:14

标签: ruby class-variables

您可以创建类的实例变量,并将其访问者定义为该类的单例方法。 但像@@var这样的类变量表现得很奇怪,尤其是在继承时。它有用例吗?

2 个答案:

答案 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一次,您可以预期ArrayA的行为一致。

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)

类变量用于将值传递给类中的不同方法。