1.1 - Introduction à Ruby


Ressources

Environnement de développement

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.

Variables

# 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

Console

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

Structures de contrôle

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

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

💻 Pair/Impair

Créer une fonction qui reçoit un nombre en paramètre et indique s'il est pair ou impair.

[Nombre] est [pair/impair]
  • Valider que c'est bien un nombre entier positif, sinon afficher un message dans la console

Générer ensuite la table de multiplication du nombre

  • De 1 au nombre si PAIR
  • Du nombre à 1 si IMPAIR
[Nombre] est [pair/impair]

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