Présentation de Ruby
Rencontres Mondiales du Logiciel Libre
Mont-de-Marsan, mercredi 2 juillet 2008
page 2 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Présentation de Ruby
page 2 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Présentation de Ruby
en 45 minutes
la syntaxe
l’aspect orienté objet
quelques spécificités
un mot la méta-programmation
page 2 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Présentation de Ruby
page 3 sur 33
Un petit mot à mon propos
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Guillaume “Zifro” Desrat
<guillaume.desrat@rubyfrance.org> && http://zlab.fr/
Rubyiste depuis 2002
Railer depuis 2005
Président de l’association
participe aux listes Ruby et Rails
passe sur #rubyfr @ irc.freenode.net
consultant informatique au Luxembourg
page 3 sur 33
Un petit mot à mon propos
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Guillaume “Zifro” Desrat
<guillaume.desrat@rubyfrance.org> && http://zlab.fr/
Rubyiste depuis 2002
Railer depuis 2005
Président de l’association
participe aux listes Ruby et Rails
passe sur #rubyfr @ irc.freenode.net
consultant informatique au Luxembourg
en mission chez un grand nom de la finance
Qui est ce type qui nous parle ?
page 3 sur 33
Un petit mot à mon propos
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Guillaume “Zifro” Desrat
<guillaume.desrat@rubyfrance.org> && http://zlab.fr/
Rubyiste depuis 2002
Railer depuis 2005
Président de l’association
participe aux listes Ruby et Rails
passe sur #rubyfr @ irc.freenode.net
consultant informatique au Luxembourg
page 4 sur 33
Le langage Ruby
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Un langage interprété, orienté objet, dynamique et
agréable, qui se veut “naturel”, pas “simple”
Créé par Yukihiro Matsumoto, alias “matz”
Inspiré de Perl, Smalltalk, Eiffel, Ada, LISP
Développé à partir de 1993, diffusé depuis 1995
Aujourd’hui en versions 1.8.6, 1.8.7 et 1.9.0
JRuby
(http://jruby.codehaus.org/) écrit en JAVA, soutenu par Sunrubinius
(http://rubini.us/)un développement orienté spécifications
IronRuby
(http://www.ironruby.net/)écrit pour .NET, développement soutenu par Microsoft
Maglev
(http://ruby.gemstone.com/) basé sur SmalltalkCardinal
(http://cardinal2.rubyforge.org/) une VM permettant de tourner sous ParrotPlusieurs implémentations du langage
page 5 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-JRuby
(http://jruby.codehaus.org/) écrit en JAVA, soutenu par Sunrubinius
(http://rubini.us/)un développement orienté spécifications
IronRuby
(http://www.ironruby.net/)écrit pour .NET, développement soutenu par Microsoft
Maglev
(http://ruby.gemstone.com/) basé sur SmalltalkCardinal
(http://cardinal2.rubyforge.org/) une VM permettant de tourner sous ParrotPlusieurs implémentations du langage
page 5 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-JRuby
rubinius
IronRuby
Maglev
Cardinal
...
JRuby
(http://jruby.codehaus.org/) écrit en JAVA, soutenu par Sunrubinius
(http://rubini.us/)un développement orienté spécifications
IronRuby
(http://www.ironruby.net/)écrit pour .NET, développement soutenu par Microsoft
Maglev
(http://ruby.gemstone.com/) basé sur SmalltalkCardinal
(http://cardinal2.rubyforge.org/) une VM permettant de tourner sous ParrotPlusieurs implémentations du langage
page 5 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-page 6 sur 33
Syntaxe de base
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-ruby # variable locale
def ruby_method # identificateur
# ... # de méthode
end
$ruby # variable globale $RUBY
RubyVersion # constante
RUBY_VERSION
page 6 sur 33
Syntaxe de base
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-ruby # variable locale
def ruby_method # identificateur
# ... # de méthode
end
$ruby # variable globale $RUBY RubyVersion # constante RUBY_VERSION :ruby_version # symbole
identificateurs
conditions
exceptions
quelques idiomes
page 6 sur 33
Syntaxe de base
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-ruby # variable locale
def ruby_method # identificateur
# ... # de méthode
end
$ruby # variable globale $RUBY
RubyVersion # constante
RUBY_VERSION
page 7 sur 33
Syntaxe de base : conditions
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-if version == '1.8.6'
puts 'vous utilisez la dernière'
else
puts "passez à la #{version}"
end
puts "Mauvais format" unless obj.is_a? Hash
case version
when '1.8.6'
puts
when /^1\.8\d/
puts 'il y a plus récent'
when /^1\.9\.\d/
puts 'oh oh ;-)'
else
puts 'il est temps de se mettre à jour...'
page 8 sur 33
Syntaxe de base : les exceptions
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-begin
f = File.open('fichier.txt')
texte = f.readline
puts "L’en-tête du fichier est : #{texte}"
rescue Errno::ENOENT => e
puts "Il n'y a pas de tel fichier !"
rescue NoMethodError => e
puts "L’ouverture s’est probablement mal passée !"
rescue SyntaxError => e
puts "Une erreur du développeur ? (#{e.message})"
raise e
ensure
f.close if f.respond_to? :close
page 9 sur 33
Syntaxe de base : quelques idiomes
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-method( {:param1 => 'valeur1', :param2 => 'valeur2'} )
method( :param1 => 'valeur1', :param2 => 'valeur2' )
method :param1 => 'valeur1', :param2 => 'valeur2'
def method(params)
options = { :param1 => 'valeur par défaut'}
options.merge! params # ...
end
obj.respond_to? :methode
page 10 sur 33
Orienté objet
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
--123.abs # renvoie 123
-123.class # renvoie Fixnum
chaine = "rmll"
chaine.upcase # renvoie "RMLL"
puts chaine # affiche "rmll"
chaine.upcase! # renvoie "RMLL"
puts chaine # affiche "RMLL"
nil.class # renvoie NilClass
true.class # renvoie TrueClass
false.class # renvoie FalseClass
page 10 sur 33
Orienté objet
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
--123.abs # renvoie 123
-123.class # renvoie Fixnum
chaine = "rmll"
chaine.upcase # renvoie "RMLL"
puts chaine # affiche "rmll"
chaine.upcase! # renvoie "RMLL"
puts chaine # affiche "RMLL"
nil.class # renvoie NilClass
true.class # renvoie TrueClass
false.class # renvoie FalseClass
nil.nil? # renvoie true
appel de méthodes
déclaration de classe
utilisation
page 10 sur 33
Orienté objet
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
--123.abs # renvoie 123
-123.class # renvoie Fixnum
chaine = "rmll"
chaine.upcase # renvoie "RMLL"
puts chaine # affiche "rmll"
chaine.upcase! # renvoie "RMLL"
puts chaine # affiche "RMLL"
nil.class # renvoie NilClass
true.class # renvoie TrueClass
false.class # renvoie FalseClass
page 11 sur 33
Orienté objet : déclaration de classe
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-class Presentation < Intervention # déclaration de la classe
@@nombre = 0 # variable de classe
def initialize(intitule, duree=45) # post-constructeur
@intitule = intitule ; @duree = duree
@@nombre += 1
super # appel de la méthode
end # dans la classe mère
def to_s
@titre + ' : ' + @duree.to_s + ' minutes'
end
def self.nombre # méthode de classe
@@nombre
end
page 12 sur 33
Orienté objet : utilisation
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Presentation.nombre # renvoie 0
p = Presentation.new('Présentation de Ruby')
Presentation.nombre # renvoie 1
puts p # affiche "Présentation de Ruby : 45 minutes"
p.fin
NoMethodError: undefined method `fin' for #<Presentation:0x49214>
def p.fin
puts "Suffisamment de Ruby aujourd'hui !"
end
page 13 sur 33
Orienté objet : polymorphisme
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-module RMLL # crée un nouveau module
EDITION = 2008
# renvoie IUT, IUFM ou CCI
def lieu # ...
end end
puts RMLL::EDITION # affiche 2008
class Presentation # on rouvre la définition
include RMLL # pour inclure ce qui est défini
end # dans le module RMLL
page 14 sur 33
Un peu plus loin...
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-{ puts "salut" }
do
puts "salut"
end
lambda { puts "salut" }
proc do
puts "salut"
end
p = Proc.new { puts "salut" }
p.call # affiche "salut"
p = Proc.new { |i| puts i + 1 }
p.call 1 # affiche 2
page 14 sur 33
Un peu plus loin...
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-{ puts "salut" }
do
puts "salut"
end
lambda { puts "salut" }
proc do
puts "salut"
end
p = Proc.new { puts "salut" }
p.call # affiche "salut"
p = Proc.new { |i| puts i + 1 }
p.call 1 # affiche 2
p.call 41 # affiche 42
blocs
itérateurs
yield
page 14 sur 33
Un peu plus loin...
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-{ puts "salut" }
do
puts "salut"
end
lambda { puts "salut" }
proc do
puts "salut"
end
p = Proc.new { puts "salut" }
p.call # affiche "salut"
p = Proc.new { |i| puts i + 1 }
p.call 1 # affiche 2
page 15 sur 33
Un peu plus loin... les itérateurs
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-lyonnais = ['Frédéric', 'Alexis', 'Jérôme']
lyonnais.each do |l|
puts "Dommage, #{l} n'est pas venu cette année"
end
rmll = { 2008 => 'Mont-de-Marsan',
2007 => 'Amiens',
2006 => 'Vandoeuvre-les-Nancy',
2002 => 'Talence' }
rmll.each_pair do |annee, lieu|
puts "En #{annee}, je suis allé aux RMLL à #{lieu}"
end
rmll.keys.sort.each do |annee|
puts "En #{annee}, je suis allé aux RMLL à #{rmll[annee]}"
page 16 sur 33
Un peu plus loin... les itérateurs
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-# lecture d'un fichier, façon blocs
avertissements = erreurs = 0 # initialisation
File.open('log.txt') do |fichier| # ouverture
fichier.readlines.each do |ligne| # lecture des lignes
case ligne when /^WARN/ avertissements += 1 when /^ERR/ erreurs += 1 end end
end # fermeture automatique
puts "Il y a #{avertissements} avertissements,"
page 17 sur 33
Un peu plus loin... yield
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-class Personne
def initialize(nom)
@nom = nom
end
def salue # la méthode salue se contente d’exécuter
yield @nom # le bloc qui lui est passé
end # l’argument @nom
end
celine = Personne.new("Céline")
page 17 sur 33
Un peu plus loin... yield
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-class Personne
def initialize(nom)
@nom = nom
end
def salue # la méthode salue se contente d’exécuter
yield @nom # le bloc qui lui est passé
end # l’argument @nom
end
celine = Personne.new("Céline")
celine.salue {|n| puts "salut #{n}" } # affiche "salut Céline"
page 17 sur 33
Un peu plus loin... yield
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-class Personne
def initialize(nom)
@nom = nom
end
def salue # la méthode salue se contente d’exécuter
yield @nom # le bloc qui lui est passé
end # l’argument @nom
end
celine = Personne.new("Céline")
page 18 sur 33
Dynamisme : évaluation de code
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-eval "puts 'salut'"
def operation(operateur, operande1, operande2)
eval "#{operande1} #{operateur} #{operande2}"
end operation '+', 1, 2 # renvoie 3 operation '/', 9, 0 # renvoie... ? Presentation.class_eval do # ... end
page 18 sur 33
Dynamisme : évaluation de code
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-eval "puts 'salut'"
def operation(operateur, operande1, operande2)
eval "#{operande1} #{operateur} #{operande2}"
end operation '+', 1, 2 # renvoie 3 operation '/', 9, 0 # renvoie... ? Presentation.class_eval do # ... end
évaluation de code
interception d’appels de méthodes inexistantes
exécution des définitions
page 18 sur 33
Dynamisme : évaluation de code
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-eval "puts 'salut'"
def operation(operateur, operande1, operande2)
eval "#{operande1} #{operateur} #{operande2}"
end operation '+', 1, 2 # renvoie 3 operation '/', 9, 0 # renvoie... ? Presentation.class_eval do # ... end
page 19 sur 33
Dynamisme : méthodes inexistantes
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Presentation.nombre # renvoie 0
p = Presentation.new('Présentation de Ruby')
Presentation.nombre # renvoie 1
puts p # affiche "Présentation de Ruby : 45 minutes"
p.fin
NoMethodError: undefined method `fin' for #<Presentation:0x49214>
def p.fin
puts "Suffisamment de Ruby aujourd'hui !"
end
page 20 sur 33
Dynamisme : méthodes inexistantes
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-class Presentation
def method_missing(nom, *args) # method_missing
puts "Il n'y a pas de méthode #{nom}" # est appelée
end # avant la levée
end # de l'exception
p = Presentation.new('Présentation de Ruby')
p.fin # affiche "Il n'y a pas de méthode fin" ; pas d’exception
method_missing est l’un des nombreux “hooks”
disponibles dans Ruby
page 21 sur 33
Dynamisme : définitions exécutées
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-class Configuration
case RUBY_PLATFORM # définition d'une méthode
when /linux/ # en fonction du système
def initialize(params) # hôte
# ... end when /win32/ def initialize(params) # ... end when /darwin/ include YAIB::Extensions::Specific::OSX else
unless include YAIB::Standard
raise 'Votre OS n\'est pas supporté'
end end end
page 22 sur 33
Dynamisme : réflexivité, introspection
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-On peut interroger tous les composants du
langage, à l’exécution :
obj = Array.new obj.class
obj.class.instance_methods
obj.methods # équivalent à la ligne du dessus
obj.private_methods
obj.class.instance_methods.grep(/delete/)
obj.class.instance_methods.grep(/delete/).sort
obj.methods.grep(/^on_connect_do/).each do |method|
obj.send method
page 23 sur 33
Dynamisme : réflexivité, introspection
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-On peut rouvrir une définition, y compris celle du
langage :
class Array # la classe Array existe, on la rouvre
def longueur # ajout d’une méthode en français
length # "proxy" vers la méthode en anglais
end end arr = Array.new arr << 1 arr << 'element' arr.longueur # renvoie 2
page 24 sur 33
Dynamisme : réflexivité, introspection
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-class Counterparty def has_all_mandatory_fields_filled? # quelques vérifications end def can_be_in_completed_or_approved_status?
return false unless self.has_all_mandatory_fields_filled?
return false unless self.lgd.has_all_mandatory_fields_filled?
unless self.ratings.have_all_mandatory_fields_filled?
return false end return true end end
page 25 sur 33
Dynamisme : réflexivité, introspection
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-# modification de la classe Array
class Array
def have_all_mandatory_fields_filled?
self.each do |item|
unless item.respond_to? :has_all_mandatory_fields_filled?
return false end unless item.has_all_mandatory_fields_filled? return false end end return true end end
page 26 sur 33
Se mettre à Ruby
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-(g)vi(m)
(X)emacs
SciTE
FreeRIDE (écrit en Ruby)
e-TextEditor
TextMate (seulement OSX)
Eclipse avec les Ruby Development Tools
NetBeans 6.1 (support Ruby et JRuby)
page 26 sur 33
Se mettre à Ruby
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-(g)vi(m)
(X)emacs
SciTE
FreeRIDE (écrit en Ruby)
e-TextEditor
TextMate (seulement OSX)
Eclipse avec les Ruby Development Tools
NetBeans 6.1 (support Ruby et JRuby)
Editeurs et environnements compatibles
L’outil indispensable : irb
Ressources en ligne
Livres
page 26 sur 33
Se mettre à Ruby
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-(g)vi(m)
(X)emacs
SciTE
FreeRIDE (écrit en Ruby)
e-TextEditor
TextMate (seulement OSX)
Eclipse avec les Ruby Development Tools
NetBeans 6.1 (support Ruby et JRuby)
page 27 sur 33
Se mettre à Ruby : irb
-page 28 sur 33
Se mettre à Ruby : ressources en ligne
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Le site officiel
(http://www.ruby-lang.org/)Sa traduction
(http://www.ruby-lang.org/fr/)Le portail Ruby France
(http://www.rubyfrance.org/)Les listes de diffusion sur Google Groups
(ruby-talk@, ruby-core@, rubyfr-public@)
Les groupes de discussion sur Usenet
(comp.lang.ruby, fr.comp.lang.ruby)
Les salons IRC sur FreeNode (irc.freenode.net)
page 29 sur 33
Se mettre à Ruby : livres
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Ruby in a Nutshell
Programming Ruby
The Ruby Way
Design Patterns for Ruby
Ruby par l’exemple
page 30 sur 33
Fin de la présentation
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
page 30 sur 33
Fin de la présentation
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-?
page 30 sur 33
Fin de la présentation
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
page 32 sur 33
Fin de la présentation
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
page 32 sur 33
Où récupérer ce document
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-Le support de cette présentation sera disponible
sur http:/zlab.fr/
page 33 sur 33
Licence de ce document
RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat
-•Vous êtes libres :
•de reproduire, distribuer et communiquer cette création au public
•Selon les conditions suivantes :
•Paternité
• Vous devez citer le nom de l'auteur original de la manière indiquée par l'auteur de l'oeuvre ou le titulaire des droits qui vous confère cette autorisation (mais pas d'une manière qui suggérerait qu'ils vous soutiennent ou approuvent votre utilisation de l'oeuvre)
•Pas d’utilisation commerciale
• Vous n'avez pas le droit d'utiliser cette création à des fins commerciales
•Pas de modification
• Vous n'avez pas le droit de modifier, de transformer ou d'adapter cette création.
•résumé explicatif disponible sur
http://creativecommons.org/licenses/by-nc-nd/2.0/fr/
•vous êtes autorisé à réutiliser le logo Ruby France utilisé dans cette