1. Ruby, c'est quoi comme langage ?
Ruby c'est un langage informatique, au même titre que PHP, Python, Java, C, C++,
l'ActionScript...
Parmis tous ces langages, trois familles existent, les langages compilés, les langages
interprétés et les langages intermédiaires.
Pour information voici comment se répartissent certains langages que vous connaissez
surement :
• Langages compilés : C, C++...
• Langages interprétés : PHP, PERL...
• Langages intermédiaires : Java, ActionScript...
Pour en savoir plus sur les différences entre ces trois familles de langages, je vous invite à lire
l'explication de commentcamarche.net dont la vulgarisation est excellente (je m'étais lancé
dans une explication, mais faire clair, simple et concis à ce sujet est vraiment compliqué).
Puisque que c'est de lui qu'il s'agit, Ruby est un langage interprété, donc de la même famille
que PHP, c'est d'ailleurs lui que j'utiliserais dans les comparaisons à venir puisqu'il est
surement le langage interpreté le plus connu (au moins des lecteurs de ce blog).
D'ailleurs contrairement à la croyance qui veut que Ruby soit un truc tout nouveau qui
tombera bientôt à l'eau, Ruby est en fait aussi quot;vieuxquot; que PHP, leur première publication
ayant toutes les deux eu lieu en 1995.
Attention toutefois, Ruby est très différent de PHP !
Pourquoi ?
Orienté Web / Peut tout faire
hkairi@hotmail.com, 77 366 77 92 Page 1
2. PHP a été crée par un développeur Web pour le développement Web, les bases de PHP
viennent de la nécessité pour son créateur Rasmus Lerdorf, d'enregistrer la fréquentation sur
son CV...
Ruby quant à lui, a été crée par Yukihiro Matsumotow dit quot;Matzquot; en s'inspirant notamment de
PERL et Smalltalk, cela veut principalement dire que Ruby a été écrit pour être un langage
applicatif quot;à tout fairequot; en allant du petit script de classement de vos images aux bibliothèques
d'interfaces graphiques (il est en cela comparable au C, C++, Java...).
Non-Objet / Objet
Dans un langage objet, les objets répondent à des messages.
exemple : l'objet maVoiture reçoit un message lui demandant d'avancer donne
ma_voiture.avance()
PHP, lui, n'est pas un langage (entièrement) orienté objet.
D'ailleurs à l'origine PHP n'est pas du tout un langage objet.
Même si depuis la version 5, tout cela a bien évolué.
Toutefois, en PHP, pour mettre en majuscule un mot ou une phrase, on écrira :
strtoupper(quot;jonathanquot;)
On voit bien ici que quot;l'objetquot; traité est passé à une méthode au lieu de recevoir un message.
Si vous n'avez pas encore compris, regardez ce que cela donne en Ruby.
quot;jonathanquot;.uppercase()
Ici c'est bien l'objet (le string) qui reçoit le message lui indiquant de se mettre en majuscule.
Une des particularités de Ruby est qu'absolument tout (ou presque) est Objet.
C'est la raison pour laquelle j'ai pu écrire quot;jonathanquot;.uppercase() sans avoir auparavant créé
une instance de String...
Ruby quot;comprendquot; automatiquement que ce qui est entre deux guillemets est un string et
répond donc aux méthodes de cette classe.
On touche là une autre particularité de Ruby, le quot;Duck Typingquot; ou quot;Typage Canardquot; (si ça
marche comme un canard et si ça cancane comme un canard, alors ce doit être un canardquot; ).
Le principe est donc de ne pas forcer le programmeur à utiliser une classe donnée, mais de
l'obliger à mettre les données dans le format que nous voulons utiliser.
J'ai écrit quot;jonathanquot; entre guillemets, Ruby comprends que cet objet est un String.
Si j'écris [1, 14, 15] ce sera un Array (Tableau), {1=>quot;aaaquot;, 2=>quot;bquot;} sera un Hash (ou tableau
associatif)...
Bizarreries / P.O.L.S.
hkairi@hotmail.com, 77 366 77 92 Page 2
3. Une autre particularité de Ruby est de suivre au maximum le P.O.L.S ou quot;Principle of Least
Surprisequot; (quot;Principe de moindre surprisequot;).
Cela peut sembler une évidence, mais en gros cela veut dire que les méthodes font ce que leur
nom laisse penser qu'elles font.
Pourtant, lorsque l'on lit la documentation de PHP, on se rend compte que ce n'est pas
toujours le cas :
array_merge( array $array1 [, array $array2 [, array $... ]] )
Merges the elements of one or more arrays together so that the values of one are appended to
the end of the previous one. It returns the resulting array.
If the input arrays have the same string keys, then the later value for that key will overwrite
the previous one.
If, however, the arrays contain numeric keys, the later value will not overwrite the original
value, but will be appended.
If only one array is given and the array is numerically indexed, the keys get reindexed in a
continuous way.
La même chose en Ruby (méthode merge de la classe Hash) :
hsh.merge(other_hash)
Returns a new hash containing the contents of other_hash and the contents of hsh, overwriting
entries in hsh with duplicate keys with those from other_hash.
Vous voyez la différence, n'est ce pas
[private joke]
On peut aussi en faire la démonstration avec AS3 et Ruby pour retourner un string :
AS3 :
myString.split('').reverse().join('')
Ruby
my_string.reverse()
[/private joke]
Voilà pour la première introduction, j'espère vous avoir donner envie d'en savoir un peu plus
et je vous monterais bientot les rudiments de la syntaxe Ruby (certes un peu étrange pour un
développeur PHP ou Flash, mais tellement sexy à l'usage !)
Un peu de syntaxe Ruby...
hkairi@hotmail.com, 77 366 77 92 Page 3
4. 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 quot;Why's (poignant) guide to Rubyquot; et de Softiesonrails pour s'en
convaincre.
5.times { print quot;Hello!quot; }
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 quot;restaurantquot;.include? quot;auraquot;
En anglais lu : Exit unless restaurant includes aura
Avec cette ligne, notre programme va se terminer (exit) sauf si (unless) le mot quot;restaurantquot;
contient (include?) le mot quot;auraquot;.
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 quot;restaurantquot; contient quot;auraquot;
?.
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
hkairi@hotmail.com, 77 366 77 92 Page 4
5. 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 quot;gettersquot;.
<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
hkairi@hotmail.com, 77 366 77 92 Page 5
6. Pour information, si l'on veut aussi les quot;settersquot;, 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 = quot;Renault Clioquot;
attr_accessor :nom
def initialize(nom)
@nom = nom
end
def nom
@nom.capitalize
end
def se_presente
puts quot;Je suis une quot;+@@nom+quot; surnomée quot;+nom
end
end
ma_voiture = Voiture.new(quot;titinequot;)
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
hkairi@hotmail.com, 77 366 77 92 Page 6
7. @nom équivaut à $this->nom
@@nom équivaut à self::$nom
Alors, c'est qui qui a la plus belle syntaxe ? Supprimé : grosse
J'espère que vous avez encore appris plein de belles choses sur Ruby et je m'excuse d'avance
pour les larmes versées lors de votre prochaine tentative de codage en PHP, ActionScript,
Cobol ou Fortran .
hkairi@hotmail.com, 77 366 77 92 Page 7