3

Rubyの「定数」は慣例により定数と呼ばれますが、実際には変更可能であることを理解しています。しかし、私は彼らが「変異」したときに警告があったという印象を受けました:

class Z2
 M = [0,1]
end

Z2::M # => [0, 1]
Z2::M = [0,3]
(irb):warning: already initialized constant Z2::M
(irb):warning: previous definition of M was here

ただし、これは常に当てはまるわけではないことがわかりました。

a = Z2::M
a[1] = 2

Z2::M # => [0,2] and no warning

これは「警告」システムのギャップですか?定数の割り当てはそれを複製すると推測していますが、定数と変数が同じオブジェクトを指しているように見えるので、それも真実ではないと思いますか? これは、すべてのいわゆる「定数」が警告なしに変更されるのを防ぐために凍結する必要があるということですか?

4

3 に答える 3

0

If you do Z2::M[1] = 2 you won´t get the message either. I believe the lack of warning occours because you are changing the Array itself and not the reference Z2::M.
If M was an integer, for exemple:

class Z2
  M = 1
end

a = Z2::M
a = 2
a # => 2
Z2::M # => 1

To modify an Array from a constant without modify the original you can do:

class Z2
  M = [0,1]
end

a = Z2::M.dup
a[0] = 1
a # => [1,1]
Z2::M # => [0,1]
于 2014-10-23T21:39:46.103 に答える