2013-08-19 5 views
0

Смотрите пример код первым:рубин операция обновления массива

arr = [4, 5, 6] 
arr[2] = ["a","b","c"] # First Update 
print arr.join(","), ", len=", arr.length, "\n" 
print arr[2] ,"\n" 
arr[0..1] = [7,"h","b"] # Second Update 
print arr.join(","), ", len=", arr.length, "\n" 

Выхода:

4,5,a,b,c, len=3 
abc 
7,h,b,a,b,c, len=4 

С первым обновлением, только элемент 2 обновляются до «а». Но со вторым обновлением обновление 3 элементов до 2 существующих элементов приводит к вставке одного элемента, поэтому увеличение длины массива 1.

Мой вопрос в том, почему первое обновление не приводит к вставке элемента? Каково правило?

ответ

2

Разница в том, что вы использовали диапазон во втором случае, а не первый. Когда вы используете диапазон в качестве индекса в левой части задания, Ruby заменяет эти элементы отдельными элементами из массива с правой стороны. Когда целое число используется как индекс в левой части, этот элемент заменяется всем массивом с правой стороны.

Если вы указали arr[2..2] = ['a', 'b', 'c'] в своем первом обновлении, длина массива была бы от 3 до 5 (т. Е. Массив стал бы [4, 5, 'a', 'b', 'c']).

Официальная документация по этому вопросу находится в http://ruby-doc.org/core-2.0/Array.html#method-i-5B-5D-3D

0

После первого обновления вы заменяете третий элемент другим массивом. Таким образом, ваш массив выглядит следующим образом:

[4, 5, ["a", "b", "c"]]

Именно поэтому длина результирующего массива равна 3.

+0

Я знаю это. Но почему после второго обновления вставлен один элемент? – TieDad

1

Первое обновление raplaces один элемент в массиве с массивом в arr, используйте p arr проверить:

[4, 5, ["a", "b", "c"]] 

Второе обновление raplaces два элемента в массиве с массивом:

[7, "h", "b", ["a", "b", "c"]] 

Правило:

  1. Если используется с одним целым индексом, элемент в этом положении равен , замененным на все, что находится в правой части задания.
  2. Если используется с диапазоном, то эти элементы в исходном массиве заменены на то, что находится в правой части задания. И правая сторона сама по себе является массивом, ее элементы используются в замене.