2013-06-01 39 views
2

我想在Ruby中定义2个常量,这样第二个常量就取决于第一个常量。这是我在做什么:在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 

回答

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 
+0

只要做'MY_CONST + [:ddd]' –

+0

好点,谢谢! –

+0

如果MY_CONST被冻结,那么'MY_CONST.clone <<:ddd'将引发异常。我建议使用'.dup'而不是'.clone' –

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 
] 
+0

和你的代码和我的区别是什么? MY_CONST的价值是什么? –

+0

'self :: MY_CONST1'有什么问题?它似乎工作 –

+0

为什么+ [:ddd]按我的需要工作? –