Comme tout ce qui existe en Ruby, une String est un objet.
Les strings sont constituées d'une suite arbitraire d'octets (normalement des caractères) et s'initialisent et se manipulent comme n'importe quel autre objet.
En fait, l'un des grands atouts de Ruby, ce sont les nombreuses méthodes que l'on peut appeler sur les strings (et sur d'autres objets), qui te font gagner un temps précieux quand tu écris du code.
Dans cet exercice, on va explorer et manipuler quelques-unes de ces méthodes utilitaires.
Même si tu peux utiliser String.new(...) pour créer une string, il est bien plus courant d'utiliser un littéral.
Il existe beaucoup de littéraux différents, et ils se répartissent en deux catégories : ceux qui permettent l'interpolation et ceux qui ne la permettent pas.
Les littéraux les plus courants sont les guillemets simples et doubles ('...' et "...").
Les guillemets simples ne permettent pas l'interpolation, contrairement aux guillemets doubles.
L'interpolation consiste à inclure une string dans une autre à l'aide de la syntaxe #{}.
# Use single quotes when not interpolated
location = 'World'
# And double quotes when interpolated
puts "Hello, #{location}!" #=> "Hello, World!"
Tu peux aussi utiliser d'autres littéraux, comme %{... } pour les strings interpolées et %q{...} pour les chaînes non interpolées.
Ces littéraux sont pratiques si tes strings contiennent les caractères ' ou ".
Remarque : rien ne t'oblige à utiliser une chaîne de caractères non interpolée si elle ne contient pas d'interpolation.
Il est utile de considérer les strings de Ruby un peu comme des tableaux.
Elles ont une taille et leurs caractères sont indexés (le premier indice étant 0) :
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
On peut extraire des parties d'une string à l'aide d'indices ou de 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"
On peut aussi manipuler la valeur sémantique des strings. Ça vaut le coup d'explorer la documentation Ruby pour découvrir toutes ces méthodes, mais voici quelques exemples d'usage courant :
"hello".capitalize #=> "Hello"
"HELLO".downcase #=> "hello"
"hello".center(9) #=> " hello "
" hello ".strip #=> "hello"
"hello world".split(" ") #=> ["hello", "world"]
Tu peux aussi utiliser des méthodes comme gsub pour remplacer des caractères :
# Replace one character with another
"noob".gsub("o","0") #=> "n00b"
# (Advanced) Replace a regular expression
"Ruby really rocks".gsub(/[aieou]/,'') #=> "Rby rlly rcks"
Dans tous les exemples ci-dessus, une nouvelle String est renvoyée.
Cependant, beaucoup de méthodes ont un équivalent qui se termine par ! et qui modifie réellement la string elle-même.
# 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"
Dans cet exercice, tu vas traiter des lignes de log.
Chaque ligne de log est une chaîne de caractères qui a le format suivant : "[<LEVEL>]: <MESSAGE>".
Il existe trois niveaux de log différents :
INFOWARNINGERRORTu as trois tâches, et chacune d'elles prend une ligne de log et te demande d'en faire quelque chose. Il y a de nombreuses façons de résoudre ces tâches : choisis les méthodes que tu préfères parmi les exemples ci-dessus et vois ce que tu peux trouver.
Implémente la méthode LogLineParser#message pour renvoyer le message d'une ligne de log :
LogLineParser.new('[ERROR]: Invalid operation').message
# => "Invalid operation"
Les espaces en début et en fin de ligne doivent être supprimés :
LogLineParser.new("[WARNING]: Disk almost full\r\n").message
# => "Disk almost full"
Implémente la méthode LogLineParser#log_level pour renvoyer le niveau de log d'une ligne de log, en minuscules :
LogLineParser.new('[ERROR]: Invalid operation').log_level
# => "error"
Implémente la méthode LogLineParser#reformat qui reformate la ligne de log, en plaçant le message en premier et le niveau de log après, entre parenthèses :
LogLineParser.new('[INFO]: Operation completed').reformat
# => "Operation completed (info)"
Inscris-toi sur Exercism pour apprendre et maîtriser Ruby avec 21 concepts121 exercices, et un vrai mentorat humain, le tout gratuitement.