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

09-26 12:28