Como todo en Ruby, un String es un objeto.
Los strings están formados por una secuencia arbitraria de bytes (normalmente caracteres) y se inicializan y manipulan como cualquier otro objeto.
De hecho, una de las cosas más útiles de Ruby son los numerosos métodos que puedes llamar sobre los strings (y otros objetos) para ahorrarte mucho tiempo al escribir código.
En este ejercicio vamos a explorar y jugar con algunos de esos métodos auxiliares.
Aunque puedes usar String.new(...) para crear un string, es mucho más común usar un literal.
Hay muchos literales diferentes que puedes usar, y se dividen en dos categorías: los que permiten interpolación y los que no.
Los literales más comunes son las comillas simples y dobles ('...' y "...").
Las comillas simples no permiten interpolación, mientras que las dobles sí.
La interpolación es cuando un string se incluye dentro de otro usando la sintaxis #{}.
# Use single quotes when not interpolated
location = 'World'
# And double quotes when interpolated
puts "Hello, #{location}!" #=> "Hello, World!"
También puedes usar otros literales como %{... } para strings con interpolación y %q{...} para strings sin interpolación.
Estos son útiles si tus strings contienen los caracteres ' o ".
Nota: no existe una regla absoluta que diga que debes usar strings sin interpolación si tu string no contiene interpolación.
Es útil pensar en los strings de Ruby de forma similar a como piensas en los arrays.
Tienen un tamaño y sus caracteres están indexados (con 0 como primer índice):
my_string = "Some string"
my_string.size #=> 11
my_string[0] #=> 'S'
my_string[1] #=> 'o'
my_string[-1] #=> 'g'
# Find the first index of a character
my_string.index('m') #=> 2
Se pueden extraer partes de los strings usando índices o slice:
my_string = "Some string"
# Find three characters starting with the second character (index 1)
my_string[1, 3] #=> "ome"
my_string.slice(1, 3) #=> "ome"
Los valores semánticos de los strings también se pueden manipular. Vale la pena explorar la documentación de Ruby para aprender sobre todos los métodos, pero aquí tienes algunos ejemplos de uso común:
"hello".capitalize #=> "Hello"
"HELLO".downcase #=> "hello"
"hello".center(9) #=> " hello "
" hello ".strip #=> "hello"
"hello world".split(" ") #=> ["hello", "world"]
También puedes usar métodos como gsub para sustituir caracteres:
# Replace one character with another
"noob".gsub("o","0") #=> "n00b"
# (Advanced) Replace a regular expression
"Ruby really rocks".gsub(/[aieou]/,'') #=> "Rby rlly rcks"
En todos los ejemplos anteriores, se devuelve un nuevo String.
Sin embargo, muchos métodos tienen equivalentes que terminan en ! y que en realidad modifican el propio string.
# Use normal methods to return new strings
my_string = "hello"
my_string.capitalize #=> "Hello"
puts my_string #=> "hello"
# And bang-methods (...!) to modify the object
my_string = "hello"
my_string.capitalize! #=> "Hello"
puts my_string #=> "Hello"
En este ejercicio vas a procesar líneas de registro.
Cada línea de registro es un string con el siguiente formato: "[<LEVEL>]: <MESSAGE>".
Hay tres niveles de registro diferentes:
INFOWARNINGERRORTienes tres tareas, cada una de las cuales tomará una línea de registro y te pedirá que hagas algo con ella. Hay muchas maneras de resolver estas tareas. Elige tus métodos favoritos de los ejemplos anteriores y mira qué se te ocurre.
Implementa el método LogLineParser#message para devolver el mensaje de una línea de registro:
LogLineParser.new('[ERROR]: Invalid operation').message
# => "Invalid operation"
Se debe eliminar cualquier espacio en blanco al principio o al final:
LogLineParser.new("[WARNING]: Disk almost full\r\n").message
# => "Disk almost full"
Implementa el método LogLineParser#log_level para devolver el nivel de registro de una línea de registro, que se debe devolver en minúsculas:
LogLineParser.new('[ERROR]: Invalid operation').log_level
# => "error"
Implementa el método LogLineParser#reformat que reformatea la línea de registro, poniendo el mensaje primero y el nivel de registro después, entre paréntesis:
LogLineParser.new('[INFO]: Operation completed').reformat
# => "Operation completed (info)"
Regístrate en Exercism para aprender y dominar Ruby con 21 conceptos121 ejercicios y mentoría humana real, todo gratis.