Ruby, c'est quoi comme langage ?
Par jblanche le mardi 15 juillet 2008, 22:35 - tout public - Lien permanent
Let's go...
Dans Ruby on Rails, il y a avant tout Ruby !
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 "vieux" 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
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 "Matz" en s'inspirant notamment de PERL et Smalltalk, cela veut principalement dire que Ruby a été écrit pour être un langage applicatif "à tout faire" 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("jonathan")
On voit bien ici que "l'objet" 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.
"jonathan".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 "jonathan".uppercase() sans avoir auparavant créé une instance de String...
Ruby "comprend" 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 "Duck Typing" ou "Typage Canard" (si ça marche comme un canard et si ça cancane comme un canard, alors ce doit être un canard" ).
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 "jonathan" entre guillemets, Ruby comprends que cet objet est un String.
Si j'écris [1, 14, 15] ce sera un Array (Tableau), {1=>"aaa", 2=>"b"} sera un Hash (ou tableau associatif)...
Bizarreries / P.O.L.S.
Une autre particularité de Ruby est de suivre au maximum le P.O.L.S ou "Principle of Least Surprise" ("Principe de moindre surprise").
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 !)
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
Très intéressant cet article mon petit John, j'ai hâte de lire la suite.
Par contre la private joke est un peu fumeuse... Ton code permettrai de reverser un string mais pas un array. Et la classe Array en AS3 contient bien une méthode .reverse(). http://livedocs.adobe.com/flash/9.0...
Merci pour cette petite intro en douceur, c'est pas du luxe.
PS : pour inverser un tableau en AS3 :
myArray.reverse();
;-D
Oups c'est ca d'écrire trop vite, c'est String qui n'as pas de reverse en AS.
C'est corrigé
BJR
je veut compres quoi sert annotation linguistique en dommaine traitement automatique de langage naturelle
merci d'avence
Non c'était tout simplement le plugin DCGeshi qui n'avait pas survécu à la dernière mise a jour de Dotclear
Fil des commentaires de ce billet