gpt4 book ai didi

ruby - 修改子类的常量

转载 作者:数据小太阳 更新时间:2023-10-29 08:20:40 26 4
gpt4 key购买 nike

我是 Ruby 的新手,所以请原谅这个可能是新手的问题,但到目前为止,Google 在这方面一直没有帮助。

我在我的父类中定义了一个类常量

Items = [[1, 3, 5], [2, 4, 6]]

然后我有一个子类,我想在其中将数组 [1, 5, 9] 添加到 Items 数组中。能不能这样引用super/重新定义常量?

有点像

Items = super.Items.concat([1, 5, 9])

我不想将 Items 定义复制到我的带有附加项的子类中。

最佳答案

常量在它们定义的类或模块中以 namespace 分隔。它们通过通常的祖先路径解决。在您的子类中,您可以定义一个与父类(super class)中的常量同名的常量,并且初始化它的表达式可以引用父类(super class)的常量,因为子类的常量在初始赋值之后才会被定义。像这样:

$ pry
[1] pry(main)> class A; Items = [[1, 3, 5], [2, 4, 6]]; end
=> [[1, 3, 5], [2, 4, 6]]
[2] pry(main)> class B < A; end
=> nil
[3] pry(main)> class B; Items; end
=> [[1, 3, 5], [2, 4, 6]]
[4] pry(main)> A::Items
=> [[1, 3, 5], [2, 4, 6]]
[5] pry(main)> B::Items
=> [[1, 3, 5], [2, 4, 6]]
[6] pry(main)> class B; Items = Items.dup << [7,8,9]; end
=> [[1, 3, 5], [2, 4, 6], [7, 8, 9]]
[7] pry(main)> A::Items
=> [[1, 3, 5], [2, 4, 6]]
[8] pry(main)> B::Items
=> [[1, 3, 5], [2, 4, 6], [7, 8, 9]]

推导新常量时,注意dup如果您打算使用变异方法(如 Array#<< )对其进行修改,请使用原始文件。查看陷阱:

[9] pry(main)> class A; Foo = [[1,2],[3,4]]; end
=> [[1, 2], [3, 4]]
[10] pry(main)> A::Foo
=> [[1, 2], [3, 4]]
[11] pry(main)> class B; Foo = Foo << [5,6]; end
=> [[1, 2], [3, 4], [5, 6]]
[12] pry(main)> B::Foo
=> [[1, 2], [3, 4], [5, 6]]
[13] pry(main)> A::Foo
=> [[1, 2], [3, 4], [5, 6]]
[14] pry(main)> B::Foo.object_id == A::Foo.object_id
=> true
[15] pry(main)> B::Items.object_id == A::Items.object_id
=> false

您可以显式引用父命名空间中的常量,而无需使用 Class#superclass 命名父类(super class)

[16] pry(main)> class B; superclass::Items; end
=> [[1, 3, 5], [2, 4, 6]]

关于ruby - 修改子类的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15192604/

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