# Les fichiers Ruby ont l'extension .rb
# Nomenclature snake_case pour les noms de fichier, variables et méthodes
# CamelCase pour les classes
#
## Variables
#
# Est un commentaire
UNE_CONSTANTE = 42
# 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
"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("42abc", exception: false) # nil
# Float(...)
# Ou verifier le type d'une variable
name.is_a?(String)
# On fournit le type String, Integer, Float, Numeric, Array
name.class
# donne le type d'une variable
# ATTENTION c'est l'identifiant du type de données et non une string, donc Integer et non "integer"
#
## Manipuler la console
#
# Affichage
# puts
# print
puts("Avec")
puts("enter")
puts("a", "b", "c")
print("Sans")
print("enter")
print(1, 2 ,3)
# Saisie
# gets
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.1/String.html#method-i-strip
# permet de retirer les blancs et sauts de lignes aux 2 extremites
# name = name.strip
# ou
# name = gets.strip
# pour retirer seulement le saut de ligne
# utiliser chomp https://docs.ruby-lang.org/en/3.1/String.html#method-i-chomp
print("Bonjour #{name}")
#
## Structure de controle
#
if condition
# ...
elsif condition
# ATTENTION, pas de e... ELSif
# ...
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
# On peut utiliser les conditions sur une expressions
puts "Anonyme" if name.empty?
# VS
puts "Anonyme" unless name.length > 0
# 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
# Ou en version raccourcie
# 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")
# Equivaut 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, nil par defaut, mais on pourrait return false, par exemple
end
# Ou bien
# return unless name.is_a?(String)
print("Hello #{name}")
end
# pour les appels de methode imbriques, les parentheses peuvent être necessaires
puts(greet("Bruce"))
puts greet(42)
puts greet "Alfred"
👀 RTFM
[Nombre] est [pair/impair]
Valeur? [Nombre]
[Nombre] est [pair/impair]
[Nombre] est [pair/impair]
1 * [Nombre] = ...
2 * [Nombre] = ...
3 * [Nombre] = ...
...