在Ruby中定义2个常量

时间:2013-06-01 05:11:15

标签: ruby

我想在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

2 个答案:

答案 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