我想在ruby中定义两个常量,以便第二个常量依赖于第一个常量。我在做的是:
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
最佳答案
<<
运算符附加到其左侧的数组。因此,当您附加: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