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

  1. String.methods.sort Muestra una lista de los métodos a los que la clase String responde.
  2. String.instance_methods.sort Muestra todos los métodos de instancia a los que responden los objetos de clase String.
  3. String.instance_methods(false).sort Muestra una lista de los métodos de instancia a los que responden los objetos de clase String excluyendo los métodos definidos en las clases de las que hereda la clase String.

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

Documentación completa de la clase String