Ruby对象引用与集合引用

n_x*_*x_l 2 ruby

我正在通过The Well Grounded Rubyist,并对下面的例子感到困惑.

假设我们有一个字符串数组:

    numbers = ["one", "two", "three"]
Run Code Online (Sandbox Code Playgroud)

如果我冻结这个数组,我不能做以下事情:

    numbers[2] = "four"
Run Code Online (Sandbox Code Playgroud)

该语句是运行时错误,但是:

    numbers[2].replace("four")
Run Code Online (Sandbox Code Playgroud)

不是.

该书解释说,在最后两个语句的第一个中,我们正在尝试访问该数组.这就是我发现令人困惑的原因,因为我认为我们正在尝试访问数组的第三个元素,这是一个字符串对象.那与上一个陈述有何不同?

Dig*_*oss 5

这是不同的,因为在你正在调用的声明中String#replace.正如您所料,呼叫Array#replace 失败.

numbers.replace [1,2,3]
TypeError: can't modify frozen array
Run Code Online (Sandbox Code Playgroud)

任何给定数组索引处的对象引用可能是任意复杂的,并且冻结数组的作用不是保持这些对象不被改变......它只是想保持数组不变.你可以看到这个:

ree-1.8.7> numbers[2].object_id
 => 2149301040 
ree-1.8.7> numbers[2].replace "four"
 => "four" 
ree-1.8.7> numbers[2].object_id
 => 2149301040
Run Code Online (Sandbox Code Playgroud)

numbers[2]运行object_id后有相同的String#replace; 数组实际上没有改变.