我正在通过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)
不是.
该书解释说,在最后两个语句的第一个中,我们正在尝试访问该数组.这就是我发现令人困惑的原因,因为我认为我们正在尝试访问数组的第三个元素,这是一个字符串对象.那与上一个陈述有何不同?
这是不同的,因为在你正在调用的声明中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; 数组实际上没有改变.
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |