Ruby中如何为二维数组的指定子数组设置元素值
Ruby二维数组操作问题解答
第一个问题:为什么insert方法会新增数组?
你用的5_empty_arrays.insert[0, "Dean"]写法逻辑完全错了:
insert是数组的实例方法,正确调用格式是数组.insert(插入位置, 元素),你如果写成5_empty_arrays.insert(0, "Dean"),作用是往原二维数组的第0位插入一个新元素"Dean",相当于给原数组加了一个元素,自然会多出一个位置。- 要往第一个子数组里添加元素,得直接操作这个子数组:
5_empty_arrays = [[], [], [], [], []] 5_empty_arrays[0] << "Dean" # 等价于 5_empty_arrays[0].push("Dean") p 5_empty_arrays # => [["Dean"], [], [], [], []]
第二个问题:为什么所有子数组都出现"Dean"?
问题出在array = array.push([])* number_of_groups这行代码:
- Ruby里数组的
*运算符,复制引用类型元素时(比如子数组),复制的是对象的内存引用,而不是创建新的独立对象。也就是说,[[]] * 5生成的5个子数组,其实是指向同一个空数组的引用——它们本质上是同一个东西。 - 所以你执行
array[0] << "Dean"时,是在修改那个唯一的数组对象,所有引用它的位置(也就是所有子数组)都会同步显示修改结果。 - 而手动写
[[], [], [], [], []]时,每个[]都是独立的新数组对象,互相没有关联,修改第一个自然不会影响其他。
正确的二维数组创建方式
要生成包含5个独立空数组的二维数组,用下面两种方法都可以:
- 用
Array.new配合块(块会为每个元素生成全新的数组):number_of_groups = 5 array = Array.new(number_of_groups) { [] } array[0] << "Dean" p array # => [["Dean"], [], [], [], []] - 循环逐个添加空数组:
number_of_groups = 5 array = [] number_of_groups.times { array << [] } array[0] << "Dean" p array # => [["Dean"], [], [], [], []]
内容的提问来源于stack exchange,提问作者wanderingnowhere
相关产品推荐
相关产品推荐

