Bases du langage
Variables
Types
- Integer
1234 - Float
3.14 - String
'string'ou"string" - Boolean
trueetfalse
En Ruby, le type null est nil.
Méthodes utiles pour convertir les types
to_i: conversion en Integerto_f: conversion en Floatto_s: conversion en String
Vérifier qu’une variable est d’un certain type
En Ruby, on vérifie rarement le type d’une variable, on utilise plutôt la méthode respond_to? afin de vérifier qu’on puisse lui appliquer une certaine méthode.
def to_up(text)
if text.respond_to?(:to_s)
text.to_s.upcase
end
endDéclaration d’une variable
En Ruby, les variables ont un typage faible et peuvent changer de type à volonté.
ma_variable = 'Chaine de caractères'Inclusion de variable dans une string :
"Ceci est une chaine de caractères contenant une #{variable}"Il est possible de déclarer des variables de manière globale en la plaçant en dehors de tout bloc et en utilisant le signe $.
$variable_globale = "Hello, world !"Et pour finir, il est possible de déclarer des constantes en écrivant leur nom tout en majuscule.
MA_CONSTANTE = 1Entrées/Sorties
puts affiche une chaîne de caractères à l’écran (avec saut de ligne)
print affiche une chaîne de caractères à l’écran (sans saut de ligne)
gets récupère une entrée utilisateur (garde le saut de ligne de fin)
utliser la méthode chomp pour supprimer le saut de ligne final
nom = gets.chomp
puts "Bonjour #{nom} !"Commentaires
- Commentaires sur une ligne
En Ruby, un commentaire sur une ligne est défini par le caractère #.
# Ceci est un commentaire- Commentaires sur plusieurs lignes
Il est possible de définir un bloc de commentaires pouvant tenir sur plusieurs lignes à l’aide de =begin et =end.
=begin
Ceci est un bloc de commentaires
pouvant tenir sur plusieurs lignes.
=endConditions
Bloc if-elsif-else
if <condition>
instruction
elsif <condition>
instruction
else
instruction
endunless condition est équivalent à if !condition
Une condition if peut s’écrire sur une ligne :
puts "Condition vraie" if <condition>
puts "Condition fausse" unless <condition>Il est possible de combiner les conditions avec &&, || et !.
Bloc case-when
var = 1
case var
when 1
puts "ok"
else
puts "ko"
endIl existe une version raccourcie :
var = 1
case var
when 1 then puts "ok"
endTernaire
En Ruby, les conditions ternaires s’écrivent comme dans tous les autres langages :
puts a < b ? "ok" : "ko"Operateurs conditionnels
|| renvoie la 1ère valeur si truthy et la 2ème sinon.
a = false
b = "Salut"
puts a || b # Salut
a = "Hello"
puts a || b # Hello- Affectation conditionnelle
a = false
a ||= "Valeur par defaut"
puts a # Valeur par defaut
a = "Hello"
a ||= "Valeur par defaut"
puts a # HelloBoucles
Boucle while
while <condition> # until !<condition>
...
endBoucle for
for num in 1..10 # 1..10 = [1, 10] et 1...10 = [1, 10[
puts num
end- Sauter une itération
for num in 1..10
next if num == 3
puts num
endBoucle loop (Infinie)
loop do
...
break if <condition>
endTableaux
- Déclaration d’un tableau et accès à un élément
tableau = [1, 2, '3', '4'] # Un tableau peut contenir des éléments de types différents
puts tableau[0] # 1- Ajout d’un élément à un tableau
Pour ajouter un élément à un tableau, on peut utiliser la concaténation d’un autre tableau avec l’opérateur +, les chevrons («) ou la méthode push.
tableau += ['5']
tableau << '6'
tableau.push '7'- Retrait d’un élément du tableau
On utilise la méthode pop de la classe Array
tableau.pop- Méthodes
collectetmap
Ce sont deux fonctions identiques qui executent un bloc pour chaque élément d’un tableau et retournent le tableau resultant.
Hash
- Déclaration d’un Hash et accès à un élément
hash = { 'key' => 'value' }
puts hash['key'] # value
puts hash['inexistingKey'] # nilSyntaxe plus moderne utilisant implicitement des symboles
hash = { key: 'value' }
hash[:key] # value
puts hash[:inexistingKey] # nilEn utilisant le constructeur et en spécifiant une valeur par défaut
hash = Hash.new(0)
puts hash[:inexistingKey] # 0- Ajout d’un élément dans un Hash
hash['otherKey'] = 'otherValue'
hash[:otherKey] = 'otherValue'Itérateurs
- Méthode times
3.times do |num|
puts num
end- Méthode each
array.each do |value|
...
end
hash.each do |key, value|
...
endFonctions
- Définir une fonction
def nom_fonction(param)
return param
endEn l’absence d’instruction return, une fonction renverra le résultat de sa dernière instruction.
En Ruby, on ne teste pas le type d’un paramètre mais on tente directement de le caster.
Conventions de nommage
Les caractères spéciaux sont autorisés dans les noms de fonction ainsi que les symboles comme ‘+’, ‘-’… Traditionnellement, les fonctions possédant ces symboles implémentent les opérateurs correspondants.
?: retourne un boolean!: modifie l’objet
Paramètres optionnels
Il est possible de rendre un paramètre optionnel en précisant sa valeur par defaut
def nom_fonction(param = "Valeur par defaut")
return param
endListe de paramètres
def nom_fonction(*params)
puts params.inspect # [param1, param2, ...]
endIl est toujours possible de passer des paramètres “isolés” en les mettant avant la liste.
Procs et Blocs
Blocs
Passer un bloc a une fonction
Un bloc peut être passé à une fonction à l’aide du mot-clé yield.
def test
puts "A first text"
yield
puts "A third text"
end
test { puts "A second text" }Un bloc peut être appelé plusieurs fois en mettant plusieurs yield dans la fonction.
À partir du moment où on met un yield dans une fonction, celle-ci va obligatoirement attendre un paramètre de type bloc.
Passer un paramètre à un bloc
Il est possible de passer un ou plusieurs paramètre(s) à yield. Ils seront automatiquement passés au bloc :
def test
puts "A first text"
yield("A second text")
puts "A third text"
end
test { |text| puts text }La limite des blocs est qu’ils ne peuvent pas être sauvegardés dans des variables. Empêcher ainsi de pouvoir les réutiliser à plusieurs endroits.
Procs
On peut voir les procs comme des blocs qu’on peut sauvegarder.
- Création d’un
Proc
On peut créer un Proc avec Proc.new auquel on passe un bloc. Et on peut le sauvegarder dans une variable.
var = Proc.new { <instructions> }- Passage d’un
Procà une fonction
Pour être passé en tant que bloc à une fonction, un Proc doit être ‘converti’ en bloc. Cela se fait avec le signe &.
mon_proc = Proc.new { <instructions> }
a = [1, 2, 3]
a.map!(&mon_proc)- Appel direct d’un
Proc
Il est possible d’appeler à n’importe quel moment un Proc en utilisant la méthode call :
mon_proc = Proc.new { |param| <instructions> }
mon_proc.call("param")- Récupérer dans une fonction un bloc sous forme de
Proc
Il est possible de récupérer un bloc sous forme de Proc dans une fonction à l’aide du même signe & :
def ma_fonction(&bloc) # ici, bloc est un Proc
bloc.call("param")
end
ma_fonction { |param| <instructions> }Contrairement aux blocs, il est possible de passer plusieurs Proc à une fonction !
Lambda
En Ruby, un lambda est très similaire à un Proc.
Pour créer un lambda, il suffit de remplacer le Proc.new par lambda et lui passer un bloc.
mon_lambda = lambda { |param| <instructions> }
puts mon_lambda.inspect # On se rend compte ici qu'un lambda est un Proc particulierIl s’utilise ensuite de la même façon qu’un Proc.
Différences entre Proc et lambda
- Un lambda vérifie le nombre de paramètres fournis, alors que le Proc n’effectue aucune vérification sur les paramètres.
- Dans un lambda, le
returnretourne au sein du bloc, alors que dans un Proc, il le comprend comme unreturn“classique”.
def a_lambda
a = lambda { return "Salut" }
a.call # équivalent "Salut"
return "Au revoir"
end
def a_proc
a = Proc.new { return "Salut" }
a.call # équivalent return "Salut"
return "Au revoir"
end
a_lambda # Au revoir
a_proc # SalutNouvelle syntaxe du lambda
mon_lambda = ->(<param>) { <instructions> }Syntaxe raccourcie pour un appel de méthode sur chaque élément passé à un bloc
a = ["1", "2", 3]
a.map! { |n| n.to_i } # Syntaxe "classique"
a.map!(&:to_i) # Syntaxe raccourcie