这是我的代码:
a=["foo","foo","foo"]
b=["foo"]*3
a==b # => true
a.each{|i| i<<"bar"}
b.each{|i| i<<"bar"}
a==b # => false
Run Code Online (Sandbox Code Playgroud)
我得到了我期望的a:
["foobar", "foobar", "foobar"]
Run Code Online (Sandbox Code Playgroud)
但是b,我得到了这个:
["foobarbarbar", "foobarbarbar", "foobarbarbar"]
Run Code Online (Sandbox Code Playgroud)
这不是一个错误,只是线条
a=["foo","foo","foo"]
b=["foo"]*3
Run Code Online (Sandbox Code Playgroud)
不一样.第二种是将SAME OBJECT插入b阵列三次.在a数组中,您有三个不同的对象.在所有情况下,对象都是带有文本"foo"的字符串.
您可以通过检查对象ID来确认这一点.
a[0].object_id == a[1].object_id
=> false
b[0].object_id == b[1].object_id
=> true
Run Code Online (Sandbox Code Playgroud)
所以当你改变对象的时候<< "bar"你会改变同一个对象三次(在数组的情况下b)
要使用相同字符串的单独实例填充数组,请执行以下操作:
Array.new(3) { "foo" }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |