gpt4 book ai didi

ruby - 类变量的用例

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:41 24 4
gpt4 key购买 nike

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

最佳答案

我将您所说的奇怪解释为类变量在每个类之间没有不同,而是在类的继承层次结构中共享。

正如您提到的,Jörg W Mittag 对 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"

关于ruby - 类变量的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com