Comme je le disais dans le précédent article, la syntaxe de Ruby peut étonner au premier abord, mais sa lisibilité en est fortement améliorée. Regardons ces quelques lignes tirées ou inspirés du fameux "Why's (poignant) guide to Ruby" et de Softiesonrails pour s'en convaincre.

5.times { print "Hello!" }

Essayons de lire ce bout de code en anglais, Five times print Hello, je vous laisse deviner ce qu'il fait :)

Un autre exemple :

exit unless "restaurant".include? "aura"

En anglais lu : Exit unless restaurant includes aura
Avec cette ligne, notre programme va se terminer (exit) sauf si (unless) le mot "restaurant" contient (include?) le mot "aura".

On retiendra de cette ligne le unless , assez rare dans les autres langages qui est en fait l'inverse du if ainsi que l'utilisation très judicieuse du point d'interrogation dans le nom de méthode include? pour signifier une question, un test (est-ce que "restaurant" contient "aura" ?.
Vous aurez déduis que les méthodes ce terminant par un point d'interrogation retourneront normalement true ou false.

Allez écrivons maintenant une petite méthode (ou fonction si vous préférez, mais normalement en Programmation Orientée Objet on dit méthode).

Imaginez un appareil photo, écrivons la méthode qui prend une photo.
Celle-ci vérifiera si l'appareil est allumé et s'il reste de la place sur la carte mémoire.

def capture_clicked
  capture_image if @camera.on? && @camera.memory_available?
end

Comme vous pouvez le constater, une méthode Ruby s'écrit avec def et end.
Pour le reste c'est encore une fois plutôt standard, vous remarquerez toutefois qu'en Ruby, on peut écrire la clause if à la fin de l'instruction ce qui améliore la lisibilité.
En effet, ce que l'on veut faire dans notre cas (99% du temps) c'est capture_screen, il est donc logique de le voir tout dès le début de la méthode et pas encadré par un if comme ce serait le cas dans beaucoup d'autres langages.

Imaginons maintenant qu'on vous demande une méthode qui prendrai des photos en mode rafale tant qu'il y a de place, vous écrieriez alors simplement :

def rafale
  capture_image while @camera.memory_available?
end

Allez un dernier exemple pour la route, écrivons une petite classe Etudiant.
Celui-ci aura un nom, un prénom et un âge.
on a déjà tous écrit un truc du style avec une classe avec trois propriétés et leurs "getters".

<br />class Etudiant
{
    private $prenom;
    private $nom;
    private $age;

    function Etudiant(prenom, nom, age)
    {
        $this->prenom = prenom;
        $this->nom = nom;
        $this->age = age;
    }

    function prenom()
    {
        return $this->prenom;
    }
    function nom()
    {
        return $this->nom;
    }

    function age()
    {
        return $this->age;
    }  
}

C'est moche n'est-ce pas !
Et bien en Ruby cela nous donne :

class Etudiant

  attr_reader :prenom, :nom, :age

  def initialize(prenom, nom, age)
    @prenom, @nom, @age = prenom, nom, age
  end

end

Alors, vous voyez bien que le mot sexy n'était pas exagéré pour décrire la syntaxe de Ruby :)

Pour information, si l'on veut aussi les "setters", en PHP ce sera trois nouvelles fonctions en Ruby on remplacera juste :

attr_reader :prenom, :nom, :age

par

attr_accessor :prenom, :nom, :age

et si l'on veut mettre un peu de logique dans le getter, pour récupérer le prénom avec une majuscule au début, il suffira de l'écrire à la main

def prenom
  @prenom.capitalize
end

Vous vous demandez quand même surement ce que sont ces @ que l'on peut voir devant certaines variables.
Ce signe sert à distinguer les variables d'instances (les attributs d'un objet) des variables locales (à une méthode ou autre).
Il existe également des variables notées @@ma_variable, celles-ci sont des variables de classes, elles sont donc attachées à la classe et non à son instance.

Regardez ce petit exemple pour mieux comprendre :

class Voiture
  @@nom = "Renault Clio"

  attr_accessor :nom

  def initialize(nom)
    @nom = nom
  end

  def nom
    @nom.capitalize
  end

  def se_presente
    puts "Je suis une "+@@nom+" surnomée "+nom
  end
end

ma_voiture = Voiture.new("titine")
ma_voiture.se_presente

Cet exemple va afficher
Je suis une Renault Clio surnommée Titine.
Vous remarquerez au passage que je peux appeler les méthodes sans les parenthèses, celles-ci sont optionnelles et les conventions veulent qu'on ne les écrive pas quand il n'y a pas de paramètres.

Pour résumer pour les habitués à PHP :
nom équivaut à $nom
@nom équivaut à $this->nom
@@nom équivaut à self::$nom

Alors, c'est qui qui a la plus grosse belle syntaxe ?
Voilà pour ce soir, j'espère que vous avez encore appris plein de belles choses sur Ruby [troll]et je m'excuse d'avance pour les larmes versées lors de votre prochaine tentative de codage en PHP, ActionScript, Cobol ou Fortran :D [/troll]

Les autres articles :

Ruby, c'est quoi comme langage ?
Un peu de syntaxe Ruby...
Rails, la locomotive de Ruby !
ActiveRecord : Vos données, c'est mon dada.
ActionController : Monsieur Circulation
ActionView : Imprimeur de son état