2010-07-10 13 views
21

Si tengo una matriz a:¿Por qué Array.slice se comportan de forma diferente para (longitud, n)

  1. a[a.length] vuelve nil. Bueno.
  2. a[a.length, x] devuelve []. Bueno.
  3. a[a.length+x, y] devuelve nil. Inconsistente con 2.

Aunque este comportamiento es documented, parece extraño.

¿Alguien puede explicar las razones detrás de este diseño?

+1

Véase también [Separación de matrices en Ruby: en busca de una explicación sobre el comportamiento ilógico (tomado de Rubykoans.com)] (http://stackoverflow.com/questions/3568222/survey-arring-in-ruby-for- explanation-for-illogical-behavior-taken-fro) – Phrogz

Respuesta

27

consideran este

a = [0, 1, 2, 3] #=> [0, 1, 2, 3] 
a[0, 10]   #=> [0, 1, 2, 3] 
a[1, 10]   #=> [1, 2, 3] 
a[2, 10]   #=>  [2, 3] 
a[3, 10]   #=>   [3] 
a[4, 10]   #=>   [] 
a[5, 10]   #=>   nil 

Así a[4, 10] es la rebanada entre el 3 y el final de la matriz que es []

Donde como a[4] y a[5, 10] están acceder a elementos que no están en la matriz

Puede ser útil pensar que los puntos de división se encuentran entre los elementos, en lugar de los elementos mismos.

+1

El primer parámetro se declara como la posición "inicio", que ya está más allá del final de la matriz (y es por lo que 'a [a.length]' es 'nil') El ejemplo tiene mucho menos sentido si usa cualquier elemento que no sean los índices como elementos. –

+0

@Diego Mijelshon, cambiar los elementos a 'a = ['a', 'b', 'c', 'd']' funciona exactamente igual, la duración del resultado va de 4 a 3 a 2 a 1 a 0 y finalmente 'nil' se devuelve –

+0

Por lo tanto, es solo un detalle de implementación. No hay filosofía detrás de esto? En Python, cualquier cosa fuera del rango devuelve '[]'. En .NET, 'ArraySegment' arrojaría, y Linq devolvería una secuencia vacía. (Seguiré votando tu respuesta, pero estoy muy decepcionado con el idioma) –

5

Mire a sus amigables idiomas Lispy para la respuesta. La filosofía que está buscando comenzó con los idiomas cuya especialidad era el procesamiento LISt. Por ejemplo, aquí hay una manera de crear listas en Haskell:

1:[] => [1] 
1:2:3:[] => [1,2,3] 

Esto se llama contras-ción, para 'construir' una lista. Si aún no se ha hecho clic en la idea, considere esto: una matriz se crea agregando elementos a una lista vacía, no a 'nil'.

Cuestiones relacionadas