Ruby Array
Un array de Ruby es una colección ordenada de objetos con índice entero. Cada elemento de un array está asociado a un índice y se puede acceder a él mediante dicho índice.
Los índices de un array comienzan en 0, como en C o Java. Un índice negativo se cuenta desde el final del array, es decir, el índice -1 representa el último elemento, -2 el penúltimo, y así sucesivamente.
Los arrays de Ruby pueden almacenar objetos como String, Integer, Fixnum, Hash, Symbol, e incluso otros objetos Array.
Un array de Ruby no necesita especificar su tamaño; cuando se añaden elementos, el array de Ruby crece automáticamente.
Crear arrays
Hay varias formas de crear o inicializar un array. Una de ellas es mediante elnewmétodo de clase:
Puede establecer el tamaño del array al crearlo:
El arraynamestiene un tamaño o longitud de 20 elementos. Puede usar los métodos size o length para devolver el tamaño del array:
Ejemplo
Pruébalo »
La salida del ejemplo anterior es:
20 20
Puede asignar un valor a cada elemento del array, como se muestra a continuación:
La salida del ejemplo anterior es:
["mac", "mac", "mac", "mac"]
También puede usar un bloque con new, rellenando cada elemento con el resultado calculado en el bloque:
La salida del ejemplo anterior es:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Existe otro método para arrays, [], como se muestra a continuación:
Otra forma de crear un array es la siguiente:
En el módulo principal de Ruby hay un método Array que recibe un solo argumento; este método usa un rango como argumento para crear un array de números:
Ejemplo
La salida del ejemplo anterior es:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Métodos integrados de arrays
Necesitamos una instancia de un objeto Array para llamar a los métodos de Array. A continuación se muestra cómo crear una instancia de objeto Array:
Esto devuelve un nuevo array rellenado con el objeto dado. Ahora, usando el objeto creado, podemos llamar a cualquiera de los métodos disponibles. Por ejemplo:
Ejemplo
La salida del ejemplo anterior es:
6
A continuación se muestran los métodos públicos de array (asumiendo quearrayes un objeto Array):
| N.º | Método y descripción |
|---|---|
| 1 | array & other_array Devuelve un nuevo array que contiene los elementos comunes a ambos arrays, sin duplicados. |
| 2 | array * int [or] array * str Devuelve un nuevo array creado al concatenar int copias de self. Con un argumento String, equivale a self.join(str). |
| 3 | array + other_array Devuelve un nuevo array creado al concatenar dos arrays para producir un tercero. |
| 4 | array - other_array Devuelve un nuevo array que es una copia del array original con los elementos que aparecen en other_array eliminados. |
| 5 | str <=> other_str Compara str con other_str y devuelve -1 (menor que), 0 (igual) o 1 (mayor que). La comparación distingue entre mayúsculas y minúsculas. |
| 6 | array | other_array Devuelve un nuevo array al añadir other_array al array, eliminando duplicados. |
| 7 | array << obj Añade el objeto dado al final del array. La expresión devuelve el propio array, por lo que varias adiciones pueden encadenarse. |
| 8 | array <=> other_array Devuelve un entero (-1, 0 o +1) si el array es menor, igual o mayor que other_array. |
| 9 | array == other_array Dos arrays son iguales si contienen el mismo número de elementos y cada elemento es igual al elemento correspondiente del otro array (según Object.==). |
| 10 | array[index] [or] array[start, length] [or] array[range] [or] array.slice(index) [or] array.slice(start, length) [or] array.slice(range) Devuelve el elemento en el índiceindexo devuelve un subarray que comienza enstarty se extiende hastalengthelementos, o devuelverangeel subarray especificado. Los índices negativos se cuentan desde el final del array (-1 es el último elemento). Siindex(o el índice inicial) está fuera de rango, devuelvenil。 |
| 11 | array[index] = obj [or] array[start, length] = obj or an_array or nil [or] array[range] = obj or an_array or nil Establece el elemento en el índiceindexo reemplaza el subarray que comienza enstarty se extiende hastalengthelementos, o reemplazarangeel subarray especificado. Si el índice es mayor que la capacidad actual del array, el array crece automáticamente. Los índices negativos se cuentan desde el final del array. Silengthes cero, se insertan elementos. Si se usanilen la segunda o tercera forma, entonces desdeselfse eliminan elementos. |
| 12 | array.abbrev(pattern = nil) Paraselfcalcula un conjunto de abreviaturas explícito a partir de las cadenas. Si se pasa un patrón o una cadena, solo se consideran los casos en que la cadena coincide con el patrón o comienza con dicha cadena. |
| 13 | array.assoc(obj) Busca en un array cuyos elementos son también arrays, comparando obj con el primer elemento de cada array contenido mediante obj.==. Si hay coincidencia, devuelve el primer array contenido; si no encuentra coincidencia, devuelvenil。 |
| 14 | array.at(index) Devuelve el elemento en el índice index. Un índice negativo se cuenta desde el final deselfself. Si el índice está fuera de rango, devuelve nil. |
| 15 | array.clear Elimina todos los elementos del array. |
| 16 | array.collect { |item| block } [or] array.map { |item| block } ParaselfLlama una vez por cada elemento deblock. Crea un nuevo array que contiene los valores devueltos por block. |
| 17 | array.collect! { |item| block } [or] array.map! { |item| block } ParaselfLlama una vez por cada elemento deblock, reemplaza el elemento con elblockvalor devuelto por block. |
| 18 | array.compact Devuelveselfuna copia de, con todos losnilelementos eliminados. |
| 19 | array.compact! Elimina del array todos losnilelementos. Si no hay cambios, devuelvenil。 |
| 20 | array.concat(other_array) Añade los elementos de other_array aselfself. |
| 21 | array.delete(obj) [or] array.delete(obj) { block } desdeselfElimina deobjlos elementos iguales a. Si no encuentra un elemento igual, devuelvenil. Si no se encuentra un elemento igual y se proporciona un bloque de código opcionalblock, devuelveblockel resultado de. |
| 22 | array.delete_at(index) Elimina el elemento en el índiceindexespecificado y devuelve ese elemento. Si el índice está fuera de rango, devuelvenil。 |
| 23 | array.delete_if { |item| block } CuandoblockSi es true, eliminaselfcada elemento de. |
| 24 | array.each { |item| block } ParaselfLlama una vez por cada elemento deblock, pasando ese elemento como argumento. |
| 25 | array.each_index { |index| block } Igual que Array#each, pero pasa el índice delindexelemento, en lugar de pasar el elemento en sí. |
| 26 | array.empty? Devuelve true si el array no contiene elementos. |
| 27 | array.eql?(other) Siarrayyotheres el mismo objeto, o si dos arrays tienen el mismo contenido, devuelve true. |
| 28 | array.fetch(index) [or] array.fetch(index, default) [or] array.fetch(index) { |index| block } Intenta devolver el elemento en la posiciónindex. Siindexestá fuera del array, la primera forma lanzaIndexErroruna excepción, la segunda forma devuelvedefault, y la tercera forma devuelve el resultado de llamar ablockpasandoindexcomo valor. Un índice negativoindexse cuenta desde el final del array. |
| 29 | array.fill(obj) [or] array.fill(obj, start [, length]) [or] array.fill(obj, range) [or] array.fill { |index| block } [or] array.fill(start [, length] ) { |index| block } [or] array.fill(range) { |index| block } Las tres primeras formas establecenselflos elementos seleccionados deobj. Con unnilinicial equivale a cero.niluna longitud deself.lengthequivale a. Las últimas tres formas rellenancon los valores de block.el array.blockPasando el índice absoluto de cada elemento a rellenar. |
| 30 | array.first [or] array.first(n) Devuelve el primer elemento del array o los primerosnelementos. Si el array está vacío, la primera forma devuelvenily la segunda forma devuelve un array vacío. |
| 31 | array.flatten Devuelve un nuevo array que es un array unidimensional aplanado (de forma recursiva). |
| 32 | array.flatten! tomararrayAplana. Si no hay cambios, devuelvenilnil. (El array no contiene subarrays). |
| 33 | array.frozen? Siarrayestá congelado (o temporalmente congelado durante la ordenación), devuelve true. |
| 34 | array.hash Calcula el código hash del array. Dos arrays con el mismo contenido tendrán el mismo código hash. |
| 35 | array.include?(obj) Siselfcontiene aobj, devuelve true; de lo contrario, devuelve false. |
| 36 | array.index(obj) Devuelveselfel índice del primer objeto enindexque sea igual a obj. Si no encuentra coincidencia, devuelvenil。 |
| 37 | array.indexes(i1, i2, ... iN) [or] array.indices(i1, i2, ... iN) Este método está obsoleto en las versiones más recientes de Ruby, por lo que use Array#values_at. |
| 38 | array.indices(i1, i2, ... iN) [or] array.indexes(i1, i2, ... iN) Este método está obsoleto en las versiones más recientes de Ruby, por lo que use Array#values_at. |
| 39 | array.insert(index, obj...) Antes del elemento en elindexíndice especificado, inserta el valor dado; index puede ser negativo. |
| 40 | array.inspect Crea una versión imprimible de un array. |
| 41 | array.join(sep=$,) Devuelve una cadena, convirtiendo cada elemento del array en una cadena y usandosepel separador para crearla. |
| 42 | array.last [or] array.last(n) Devuelveselfel último elemento de. Si el array estáVacío, la primera forma devuelvenil。 |
| 43 | array.length Devuelveselfel número de elementos en. Puede ser cero. |
| 44 | array.map { |item| block } [or] array.collect { |item| block } Paraselfllama una vez por cada elemento deblock. Crea un nuevo array que contiene los valores devueltos por block. |
| 45 | array.map! { |item| block } [or] array.collect! { |item| block } Paraarrayllama una vez por cada elemento deblock, reemplazando el elemento con el valor devuelto por block. |
| 46 | array.nitems Devuelveselfel número de elementos non-nil en. Puede ser cero. |
| 47 | array.pack(aTemplateString) Según las directivas en aTemplateString, empaqueta el contenido del array en una secuencia binaria. Las directivas A, a y Z pueden ir seguidas de un número que indica la anchura del campo resultante. Las directivas restantes también pueden llevar un número que indica la cantidad de elementos del array a convertir. Si el número es un asterisco (*), todos los elementos restantes del array se convertirán. Cualquier directiva puede ir seguida de un guion bajo (_), lo que indica que el tipo especificado usa el tamaño nativo de la plataforma subyacente; de lo contrario, se usa un tamaño consistente e independiente de la plataforma. Los espacios en la cadena de plantilla se ignoran. |
| 48 | array.pop desdearrayElimina el último elemento de y devuelve ese elemento. Siarrayestá vacío, devuelvenil。 |
| 49 | array.push(obj, ...) Añade el objeto dado obj al final del array. Esta expresión devuelve el propio array, por lo que varias adiciones se pueden encadenar. |
| 50 | array.rassoc(key) Busca en un array cuyos elementos también son arrays, usando == para compararkeycon el segundo elemento de cada array contenido. Si coincide, devuelve el primer array contenido. |
| 51 | array.reject { |item| block } Devuelve un nuevo array que contiene los elementos del array para los que block no es verdadero. |
| 52 | array.reject! { |item| block } Cuando block es verdadero, dearrayelimina elementos, si no hay cambio, devuelvenil. Equivalente a Array#delete_if. |
| 53 | array.replace(other_array) tomararrayReemplaza el contenido deother_arraycon el contenido de, truncando o expandiendo según sea necesario. |
| 54 | array.reverse Devuelve un nuevo array que contiene los elementos del array en orden inverso. |
| 55 | array.reverse! tomararrayLo invierte. |
| 56 | array.reverse_each {|item| block } Igual que Array#each, peroarrayen orden inverso. |
| 57 | array.rindex(obj) Devuelve el índice del último objeto en array igual a obj. Si no se encuentra ninguna coincidencia, devuelvenil。 |
| 58 | array.select {|item| block } Llama al block con elementos consecutivos del array, devolviendo un array que contiene los elementos para los que block devuelvetrueun valor verdadero. |
| 59 | array.shift Devuelveselfel primer elemento de y lo elimina (desplazando todos los demás elementos una posición hacia abajo). Si el array está vacío, devuelvenil。 |
| 60 | array.size Devuelvearrayla longitud de (número de elementos). Alias de length. |
| 61 | array.slice(index) [or] array.slice(start, length) [or] array.slice(range) [or] array[index] [or] array[start, length] [or] array[range] Devuelve el elemento en el índiceindex, o devuelve el subarray desdestarthastalengthelementos, o devuelve el subarray especificado porrange. Los índices negativos cuentan desde el final del array (-1 es el último elemento). Siindex(o el índice de inicio) está fuera de rango, devuelvenil。 |
| 62 | array.slice!(index) [or] array.slice!(start, length) [or] array.slice!(range) Eliminaindex(la longitud es opcional) orangelos elementos especificados. Devuelve el objeto eliminado, subarray; siindexestá fuera de rango, devuelvenil。 |
| 63 | array.sort [or] array.sort { | a,b | block } Devuelve un array ordenado. |
| 64 | array.sort! [or] array.sort! { | a,b | block } Ordena el array. |
| 65 | array.to_a Devuelveself. Si se llama enArrayuna subclase de, convierte el receptor en un objeto Array. |
| 66 | array.to_ary Devuelve self. |
| 67 | array.to_s Devuelve self.join. |
| 68 | array.transpose Asume que self es un array de arrays y transpone filas y columnas. |
| 69 | array.uniq Devuelve un nuevo array, eliminando los valores duplicadosarray. |
| 70 | array.uniq! desdeselfElimina elementos duplicados. Si no hay cambio (es decir, no se encuentran duplicados), devuelvenil。 |
| 71 | array.unshift(obj, ...) Antepone el objeto al frente del array, desplazando los demás elementos una posición hacia arriba. |
| 72 | array.values_at(selector,...) Devuelve un array que contiene los elementos de self correspondientes alselectorselector(es) dado(s). Los selectores pueden ser índices enteros o rangos. |
| 73 | array.zip(arg, ...) [or] array.zip(arg, ...){ | arr | block } Convierte cualquier argumento en arrays, y luegoarrayfusiona los elementos de con los elementos correspondientes de cada argumento. |
Directivas pack de arrays
La siguiente tabla enumera las directivas de empaquetado del método Array#pack.
| Directiva | Descripción |
|---|---|
| @ | Se mueve a la posición absoluta. |
| A | Cadena ASCII (rellenada con espacio, count es la anchura). |
| a | Cadena ASCII (rellenada con null, count es la anchura). |
| B | Cadena de bits (orden descendente) |
| b | Cadena de bits (orden ascendente). |
| C | Carácter sin signo. |
| c | Carácter. |
| D, d | Número de coma flotante de doble precisión, formato nativo. |
| E | Número de coma flotante de doble precisión, orden de bytes little-endian. |
| e | Número de coma flotante de precisión simple, orden de bytes little-endian. |
| F, f | Número de coma flotante de precisión simple, formato nativo. |
| G | Número de coma flotante de doble precisión, orden de bytes de red (big-endian). |
| g | Número de coma flotante de precisión simple, orden de bytes de red (big-endian). |
| H | Cadena hexadecimal (nibble alto primero). |
| h | Cadena hexadecimal (nibble bajo primero). |
| I | Entero sin signo. |
| i | Entero. |
| L | Long sin signo. |
| l | Long. |
| M | Quoted-Printable, codificación MIME. |
| m | Cadena codificada en Base64. |
| N | Long, orden de bytes de red (big-endian). |
| n | Short, orden de bytes de red (big-endian). |
| P | Puntero a una estructura (cadena de longitud fija). |
| p | Puntero a una cadena terminada en null. |
| Q, q | Número de 64 bits. |
| S | Short sin signo. |
| s | Short. |
| U | UTF-8. |
| u | Cadena codificada en UU. |
| V | Long, orden de bytes little-endian. |
| v | Short, orden de bytes little-endian. |
| w | Entero comprimido BER \fnm. |
| X | Salta hacia atrás un byte. |
| x | Byte nulo. |
| Z | Igual que a, excepto que se añade null con *. |
Ejemplo
Pruebe el siguiente ejemplo, empaquetando varios datos.
Ejemplo
El resultado de ejecutar el ejemplo anterior es:
a b c abc ABCOtras extensiones