我想在Ruby中定义2个常量,使第二个常量取决于第一个常量。这就是我正在做的事情:
class MyClass
MY_CONST = [
:aaa,
:bbb,
:ccc
]
MY_CONST2 = self::MY_CONST << :ddd
end
但是,下面的代码出于某种原因打印第二个常量的值。
puts MyClass::MY_CONST
puts '------------------'
puts MyClass::MY_CONST2
##################
aaa
bbb
ccc
ddd
------------------
aaa
bbb
ccc
ddd
为什么呢?有没有办法摆脱它,除了将它们定义为def
?
def self.my_const
[:aaa, :bbb, :ccc]
end
def self.my_const2
self::my_const << :ddd
end
答案 0 :(得分:4)
你正在访问常数错误。它是一个类常量,因此,当您定义该类时,您可以在本地引用它:
class MyClass
MY_CONST = [
:aaa,
:bbb,
:ccc
]
MY_CONST2 = MY_CONST + [:ddd]
end
另外,你正在改变MY_CONST
,这不是你想要做的。 <<
更改了MY_CONST
的值,然后分配给MY_CONST2
,因此它们都是相同的:
MyClass::MY_CONST.object_id
# => 70359163729880
MyClass::MY_CONST2.object_id
# => 70359163729880
正确定义MY_CONST2
之后:
[14] (pry) main: 0> MyClass::MY_CONST [ [0] :aaa, [1] :bbb, [2] :ccc ] [15] (pry) main: 0> MyClass::MY_CONST2 [ [0] :aaa, [1] :bbb, [2] :ccc, [3] :ddd ]
答案 1 :(得分:3)
<<
运算符追加到左侧的数组。因此,当您追加:ddd
时,您会将其附加到MY_CONST
。
避免这种情况的一种方法是在追加之前使用.dup
复制数组:
class MyClass
MY_CONST = [
:aaa,
:bbb,
:ccc
]
MY_CONST2 = MY_CONST.dup << :ddd
end
(感谢@ShawnBalestracci指出我最初使用的.clone
代码的问题。)
或者使用+
运算符作为@DavidGrayson建议,它创建一个新数组而不是修改原始数组:
class MyClass
MY_CONST = [
:aaa,
:bbb,
:ccc
]
MY_CONST2 = MY_CONST + [ :ddd ]
end
无论哪种方式打印您要找的内容:
puts MyClass::MY_CONST
puts '------------------'
puts MyClass::MY_CONST2
aaa
bbb
ccc
------------------
aaa
bbb
ccc
ddd