Ruby: какая разница с этими двумя массивами? - PullRequest
1 голос
/ 17 июля 2010

Смущаемся здесь синтаксисом, но какая разница между:

foo[x][y] 

и

foo[x, y]

Ответы [ 3 ]

8 голосов
/ 17 июля 2010
  • foo[x, n] возвращает n элементов из foo, начиная с x-го элемента.
  • foo[x][y] находит x-й элемент в foo и возвращает его y-й элемент.

Вот пример для демонстрации:

> foo = [[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]]
=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]]
> foo[1,2]
=> [[3, 4, 5], [6, 7, 8]]
> foo[1][2]
=> 5
3 голосов
/ 17 июля 2010

Другие объяснения хороши, но вот другое мнение.

foo[x] является синтаксическим сахаром для foo.slice(x). Аналогично, foo[x,y] эквивалентно foo.slice(x,y). Если вы посмотрите на rubydocs , вы увидите, что

array.slice(index) возвращает значение по индексу, а

array.slice(start,length) с двумя параметрами возвращает подмассив, начинающийся с start и имеющий length элементов.

Следовательно, вы можете думать о foo[x][y] как о foo.slice(x).slice(y), который берет элемент y th из массива в позиции x массива foo, который явно отличается от foo[x,y] или foo.slice(x,y), который извлекает подмассив значений из самого foo.

1 голос
/ 17 июля 2010

Там первый синтаксис позволяет вам индексировать в двумерный массив (т.е. массив массивов), например,

irb(main):035:0> l = [[1,2,3],[4,5,6],[7,8,9]]
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
irb(main):036:0> l[0]
=> [1, 2, 3]
irb(main):037:0> l[0][0]
=> 1

Вторая возвращает y элементов из массива, начиная с позиции x, например,

irb(main):038:0> a = [1,2,3,4,5,6,7,8]
=> [1, 2, 3, 4, 5, 6, 7, 8]
irb(main):039:0> a[2,3]
=> [3, 4, 5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...