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
4

2 回答 2

4

您正在访问常量错误。它是一个类常量,因此,当您定义该类时,您可以在本地引用它:

class MyClass

  MY_CONST = [
    :aaa,
    :bbb,
    :ccc
  ]

  MY_CONST2 = MY_CONST + [:ddd]
end

另外,您正在 mutating MY_CONST,这不是您想要做的。<<更改MY_CONSTthen 分配给的值,MY_CONST2因此它们都是相同的:

MyClass::MY_CONST.object_id
# => 70359163729880
MyClass::MY_CONST2.object_id
# => 70359163729880

正确定义后MY_CONST2

[14](撬)主:0> MyClass::MY_CONST
[
    [0]:aaa,
    [1] :bb,
    [2] :cc
]
[15](撬)主:0> MyClass::MY_CONST2
[
    [0]:aaa,
    [1] :bb,
    [2] :ccc,
    [3] :dd
]
于 2013-06-01T05:16:48.993 回答
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
于 2013-06-01T05:24:38.943 回答