Ruby est un langage de script et nécessite un interpréteur pour pouvoir être utilisé.
Toutefois, selon votre système d'exploitation, la version de Ruby disponible peut varier. Pour uniformiser le processus de développement nous partagerons une machine virtuelle Linux équipée de Ruby 3.
Pour éditer le code, il faudra se connecter à la machine virtuelle via SSH et y exécuter le code. Visual Studio Code offre une extension permettant de faciliter cette manipulation, sinon vous pouvez également utiliser Nano ou Vim en ligne de commande.
L'interpréteur Ruby est disponible via la commande ruby
, utilisez ruby -v
pour valider la version installée
$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux-gnu]
Pour exécuter un fichier Ruby, ruby fichier.rb
Fichier program.rb
print("Allo!")
Terminal
$ ruby program.rb
Allo!
Ruby offre également un interpréteur intéractif qui permet d'exécuter du code Ruby sans créer de fichier via irb
$ irb
irb(main):001:0> print("Allo!")
Allo!=> nil
irb(main):002:0>
Taper exit
pour quitter irb.
# Les fichiers Ruby ont l'extension .rb
# Nomenclature snake_case pour les noms de fichier, variables et fonctions
# Est un commentaire
#
## Variables
#
UNE_CONSTANTE = 3.1415926535897
# Ruby leve un avertissement si on reassigne un valeur mais ne l'empeche pas
un_entier = 7
un_entier = un_entier * 2
un_nombre = 2.5
une_string = "Allo!"
une_string += " Ca va?" # Donne "Allo! Ca va?"
un_boolean = true # ou false
le_vide = nil # Represente un vide explicite
# En Ruby, tout est VRAI, sauf false et nil
# Interpolation de string #{...}
name = "James"
age = 42
greetings = "Bonjour #{name.swapcase}, vous avez #{age} ans!"
# Types
# On peut convertir une variable vers un autre type
# pour le manipuler plus efficacement,
# par exemple faire un calcul mathematique sur une saisie
"12".to_i
# to_f
# to_s
"7abc".to_i # 7?
# Ces méthodes sont peu robuste, on peut utiliser une conversion plus stricte
Integer(7, exception: false)
Integer("8abc", exception: false) # nil
# Float(...)
# Ou verifier le type d'une variable
name.is_a?(String)
# On fournit le type String, Integer, Float, Numeric, Array
# variable.class pour connaitre le type d'une variable
#
## Manipuler la console
#
# Affichage
puts("Avec")
puts("enter")
puts("a", "b", "c")
print("Sans")
print("enter")
print(1, 2 ,3)
# Saisie
print("Votre nom: ")
name = gets # Le enter est inclut dans le resultat,
# gets retourne une string
# donc la methode strip https://docs.ruby-lang.org/en/3.0/String.html#method-i-strip
# permet de retirer les blancs et sauts de lignes aux extremites
# name = gets.strip
# pour retirer seulement le saut de ligne
# utiliser chomp https://docs.ruby-lang.org/en/3.0/String.html#method-i-chomp
print("Bonjour #{name}")
# Pour recuperer un nombre
print("Votre age: ")
age = gets.strip
print("Votre age en annee de chien est #{age * 7}")
# On constate 2 choses:
# - Les string supportent l'operateur * pour dupliquer leur contenu
# - On doit convertir en nombre pour faire le calcul
#
## Structure de controle
#
if condition
# ...
elsif condition
# ...
else
# ...
end
# Plutot que d'utiliser le ! pour inverser une condition dans un if
# Ruby offre la structure unless
if !name.empty?
# ...
end
# equivaut a
unless name.empty?
# ... sera execute SAUF SI condition VRAI
end
# Boucles
for number in 0..5 # ... pour exclure 5
puts(number)
end
# Ruby propose le mecanisme de Blocks http://ruby-for-beginners.rubymonstas.org/blocks.html
# pour fournir un bout de code a executer dans un contexte precis
# On peut exploiter les methodes times et upto/downto des nombres pour creer des boucles
# Ces méthodes crées un objet de type Range https://docs.ruby-lang.org/en/3.1/Range.html
5.times do
puts("Allo!")
end
10.downto(0) do |number|
puts(number)
end
while condition
# ...
end
# Comme avec unless, la boucle until permet d'exprimer clairement une condition qui serait inversee
until condition
# ...
end
loop do
# ...
# Avec la structure loop/do...while
# il faut manuellement terminer l'iteration avec break
if condition
break
end
# break if condition
# break unless condition
end
#
## Methodes
#
# On doit definir la methode AVANT de pouvoir l'utiliser
def hello
print("Name? ")
name = gets.strip
print("Hello #{name}")
end
hello
# on peut omettre les ()
# hello est equivalent a hello()
def greet(firstname, lastname)
puts("Ahoy #{firstname} #{lastname}")
end
greet("Bruce", "Wayne")
# Equivalent a greet "Bruce", "Wayne"
# Nommer les parametres pour reduire l'ambiguite
# Ex: greet("Bruce", "Wayne") VS greet("Wayne", "Bruce")
def greet(firstname:, lastname:)
puts("Ahoy #{firstname} #{lastname}")
end
greet(firstname: "Bruce", lastname: "Wayne")
# egalement interchangeable
greet(lastname: "Pennyworth", firstname: "Alfred")
# Valeur de retour
# Le mot-cle return est implicite,
# le resultat de la derniere operation
# est automatiquement renvoye
# On peut explicitement return pour interrompre la fonction plus tot
def greet(name)
if ! name.is_a?(String)
return # Pas de valeur necessaire ici, mais on pourrait return false, par exemple
end
# Ou bien
# return unless name.is_a?(String)
print("Hello #{name}")
end
p(greet("James"))
p(greet(42))
Créer une fonction qui reçoit un nombre en paramètre et indique s'il est pair ou impair.
[Nombre] est [pair/impair]
Générer ensuite la table de multiplication du nombre
[Nombre] est [pair/impair]
1 * [Nombre] = ...
2 * [Nombre] = ...
3 * [Nombre] = ...
...