Échange de données 1

Variables

# 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"

Console

#
## 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}")

Structures de contrôle

#
## 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

Méthodes

#
## 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"

Go!

Pair/Impair

👀 RTFM

Sortie
[Nombre] est [pair/impair]
Sortie
Valeur? [Nombre]
[Nombre] est [pair/impair]

Sortie
[Nombre] est [pair/impair]

1 * [Nombre] = ...
2 * [Nombre] = ...
3 * [Nombre] = ...
...