Un peu de syntaxe Ruby...
Par jblanche le samedi 19 juillet 2008, 22:05 - tout public - Lien permanent
Vous avez apprécier l'article précédent ?
Alors, essayons d'écrire un peu plus de Ruby...
Pour commencer, si vous souhaitez tester ces exemples sur votre poste je vous invite à installer Ruby sur votre machine.
Pour les autres, vous pouvez tester en ligne ou vous contenter de lire :).
Pour l'installation, les Linuxiens se débrouillerons avec leur gestionnaire de paquets pour installer les paquets ruby irb et rdoc.
Pour les utilisateurs de Windows, je vous invite à utiliser le one-click install qui vous donnera
tout ce qu'il faut pour commencer.
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
Commentaires
un petit commezntaire pour te dire qu'il est particukièrement agréable de surfer surt on blog
Ouaip. C'est vrai que ça fait envie. J'ai hâte de voir la suite et surtout l'accès à une BDD.
Juste pour clarifier : le ':' en face des getters/setters, ça veut dire que c'est des getters/setters ou bien?
Non pas du tout

En fait, il faut lire les symboles (les ":quelquechose") comme des strings, mais ceux ci sont un peu particuliers, ils sont plus légers car non modifiables entre autre.
Ils servent en Ruby lorsque l'on veut donner un paramètre ou une clé de tableau qui n'est pas susceptible de changer.
genre find(:first), ou find(:all) ces parametres sont des strings mais on ne les modifiera pas dans notre code donc Symbole
Je sais pas si je me suis bien fait comprendre
Pour la BDD, ca arrive
juste pour dire que j'avoue, la syntaxe Ruby est vraiment sexy! Ça donne envie de s'y intéresser!
J'ai une question de noob.
Etant principalement graphiste et développeur flash, je connais pas grand chose du php et des autres langages de *gozu* de la prog.
Le Ruby, ça peut s'utiliser de la même manière que le php en faisant simplement des fichiers utilisés par-ci, par-là ou en en insérant dans du html ou c'est plus compliqué que ça ?
Parce que j'avoue que le syntaxe est tellement simple que ça semble intéressant.
Et il y a possibilité de lier du Ruby et de l'AS comme on peut le faire avec php ?
Bravo en tout cas pour tes articles, simples à comprendre et intéressants.
Salut Skoua,
Tu peut tout à fait utiliser Ruby par ci par la, en faisant les choses comme avec PHP.
Toutefois je t'invite à lire la suite de ce tuto et particulièrement les articles sur Rails pour constater que celui ci simplifie ENORMEMENT ce travail.
Tu constatera également qu'avec RubyAMF (équivalent Ruby de AMFPHP), tu pourras discuter avec Flash très facilement (je ferais peut-être un article la dessus bientôt).
Bonne lecture
Là aussi, bravo et merci ! J'aimerais préciser encore deux ou trois trucs ultra sexy de Ruby :
<b>- on peut avoir des paramètres optionnels</b>
def bonjour(nom = "toto", m=true, age = 42,)
puts "Je vous présente #{nom}, #{m ? 'il' : 'elle'} a #{age} ans."
end
Testez avec bonjour, bonjour('Guybrush'), ou encore bonjour('Elaine', true, 18)
<b>- on peut définir des méthodes genre "getter/setter" avec une syntaxe pratique</b>
Vous voulez faire de la gestion particulière quand on modifie une variable ? Vos utilisateurs n'ont pas besoin de savoir ça. Ou mieux, ça vous permet de changer l'API sans douleur.
def age
logger.debug("Quelqu'un a demandé l'âge de #{@nom}")
@age
end
def age=(n)
@@plus_vieux = n if age > @@plus_vieux
@age = n
end
Voilà, avec ce code par exemple, j'enregistre quand quelqu'un veut l'âge, et je conserve une variable de classe qui "connaît" l'âge du plus vieux sans avoir à tout rechercher et la recalculer. Tandis que vous, si vous utilisez mon code, vous ne voyez pas la différence et vous faites toujours etudiant.age et etudiant.age = 24. Alors qu'en Java et Javascript, vous seriez obligé de mettre des parenhtèses le jour où ça devient une méthode, genre etudiant.age() et etudiant.setAge(23).
<b>On peut étendre et modifier les classes. Toutes les classes.</b>
Vous voulez pouvoir faire tel ou tel truc sur une chaîne ? Appeler une fonction d'ailleurs c'est pénible, nous on aime l'objet. Vous voulez appeler telle méthode indifféremment sur une Hash, un Array ou une String ? Pas de souci.
class Array
def dessine
puts '[' + self.map {|x| x.dessine}.join(", ") + ']'
end
end
class Hash
def dessine
puts '{' + self.map {|k,v| k.dessine+ " => " + v.dessine }.join(", ") + '}'
end
end
class String
def dessine
puts self
end
end
Merci jblanche pour la réponse, même si j'ai mis du temps à la voir. :D
Je vais regarder ça, il faut un serveur configuré d'une certaine manière pour utiliser Ruby ou un serveur Linux "banal" suffit ?
Salut,
Moi j'ai trouvé plus simple pour ton exemple mais en PHP !!!
<?php
echo 'Je suis une Renault Clio surnommée Titine.';
?>
Cool non ?
Slt,
Je voudrais savoir c quoi l'utlité de "self"
exemple :
def self.authentifier(login)
...
end
Le self signifie que la méthode est une méthode de classe et non une méthode d'instance. Pour l'uliliser on fera donc
MyClass.authentifier
et pas
MyClass.new.authentifier
Cordialement,
Merciiiiii
SVP,j'ai pas bien compris la difference entre une méthode de classe et une méthode d'instance .Puisque dans les autres languages on a une classe qui a des méthodes et on créé une instance de cette classe et par la suite on utilise les méthodes de cette classe.Alors en se qui concerne Ruby???
Fil des commentaires de ce billet