Más acerca de las cadenas (strings)
Hay muchos métodos en la clase String (no tienes que memorizarlos todos; siempre
puedes buscarlos en la documentación):
reverse |
Regresa una copia de la cadena original con los caracteres en orden inverso. No modifica la cadena original. |
lenght |
Regresa el número de caracteres de la cadena (incluyendo espacios en blanco). |
upcase |
Regresa una copia de la cadena cambiando todos los caracteres a letras mayúsculas. |
downcase |
Regresa una copia de la cadena cambiando todos los caracteres a letras minúsculas. |
swapcase |
Regresa una copia de la cadena invirtiendo las letras mayúsculas y minúsculas. |
capitalize |
Regresa una copia de la cadena can el primer caracter en mayúscula. |
slice |
Regresa una subcadena de la cadena original |
Los métodos upcase, downcase, swapcase, y capitalize tienen métodos correspondientes
que modifican la cadena original en lugar de regresar una copia:
upcase!, downcase!, swapcase!, capitalize!. Asumiendo que
no necesitas conservar la cadena en su estado original, estos métodos ahorran memoria,
particularmente si se trata de cadenas muy largas.
Sabemos que las cadenas son secuencias de caracteres entre comillas sencillas o
dobles. La diferencia entre las dos formas es cómo Ruby procesa cada una. En el caso
de comillas sencillas, Ruby hace muy poco. En el caso de comillas dobles, Ruby tiene
más trabajo que hacer. Primero, busca sustituciones (secuencias que comienzan con una
diagonal invertida) y las reemplaza con algún valor binario. La segunda cosa que Ruby
hace con cadenas entre comillas dobles es la interpolación de expresiones.
Dentro de una cadena, la secuencia #{expresion} es reemplazada por el valor de
la expresión. Observa el programa p013interpolacion.rb:
1 def di_buenas_noches(nombre) 2 resultado = "Buenas noches, #{nombre}" 3 return resultado 4 end 5 puts di_buenas_noches('Juan') 6 7 # programa modificado 8 #recuerda que en Ruby, los metodos regresan el valor de la ultima 9 #linea, por eso podemos expresar el mismo metodo de la siguente manera: 10 11 def di_buenas_noches2(nombre) 12 13 "Buenas noches, #{nombre}" 14 end 15 puts di_buenas_noches2('Alvarez') 16
Es importante notar que cada vez que una cadena es utilizada en una asignación o como
parámetro, un nuevo objeto de la clase String es creado.
¿Cómo se maneja la memoria para las cadenas en Ruby? ¿Hay un pool separado para
la cadenas? Las cadenas son objetos de la clase String. La clase String tiene
más de 75 métodos estándar. De acuerdo a la guía de usuario de Ruby: “no tenemos
que tomar en consideración el espacio que ocupa una cadena. Estamos libres de
la administración de la memoria.”
Mostrar una lista de todos los métodos de una clase u objeto
String.methods.sortMuestra una lista de los métodos a los que la claseStringresponde.String.instance_methods.sortMuestra todos los métodos de instancia a los que responden los objetos de claseString.String.instance_methods(false).sortMuestra una lista de los métodos de instancia a los que responden los objetos de claseStringexcluyendo los métodos definidos en las clases de las que hereda la claseString.
Comparando igualdad de dos cadenas
Las cadenas tienen varios métodos para probar su igualdad. El más común es == (doble signo
de igual). Otra prueba de igualdad es el método String.eql?, que prueba si el contenido
de dos cadenas es idéntico. Regresa el mismo resultado que ==. Un tercer método,
String.equal? prueba si dos cadenas son el mismo objeto. Observa el ejemplo en p013strcmp.rb:
1 # String#eql?, prueba que dos cadenas tengan contenido identico. 2 # Regresa el mismo resultado que == 3 # String#equal?, prueba que dos cadenas sean el mismo objeto. 4 s1 = 'Jonathan' 5 s2 = 'Jonathan' 6 s3 = s1 7 if s1 == s2 8 puts 'El contenido de ambas cadenas es idéntico.' 9 else 10 puts 'El contenido de ambas cadenas no es idéntico.' 11 end 12 if s1.eql?(s2) 13 puts 'El contenido de ambas cadenas es idéntico.' 14 else 15 puts 'El contenido de ambas cadenas no es idéntico.' 16 end 17 if s1.equal?(s2) 18 puts 'Las dos cadenas son el mismo objeto.' 19 else 20 puts 'Las dos cadenas son el mismo objeto.' 21 end 22 if s1.equal?(s3) 23 puts 'Las dos cadenas son el mismo objeto.' 24 else 25 puts 'Las dos cadenas son el mismo objeto.' 26 end
Usando %w
Algunas veces, crear Arrays de palabras puedes ser tedioso con todas esas comas y
comillas. Afortunadamente, Ruby tiene un ataja: %w% hace justo lo que necesitamos.
1 nombres1 = ['ana', 'ricardo', 'guillermo', 'susana', 'paty'] 2 puts nombres1[0] # ana 3 puts nombres1[3] # susana 4 5 #esto es lo mismo: 6 nombres2 = %w(ana ricardo guillermo susana paty) 7 puts nombres2[0] # ana 8 puts nombres2[3] # susana
Ejercicio: Si queremos invertir el orden de las palabras de una cadena (en vez de
el orden de cada letra), podemos utilizar el método String.split, que regresa un
array de palabras. La clase Array (más acerca de esta clase más adelante) tiene
un método llamado reverse, así que puedes invertir el array y luego unirlo de nuevo
para crear la cadena.
1 palabras = 'Aprendiendo Ruby - Tu guia para aprender Ruby' 2 puts palabras.split(' ').reverse.join(' ') 3 4 # Ruby aprender para guia Tu - Ruby Aprendiendo