• Aucun résultat trouvé

[PDF] Cours de Ruby pour débutant en pdf | Formation informatique

N/A
N/A
Protected

Academic year: 2021

Partager "[PDF] Cours de Ruby pour débutant en pdf | Formation informatique"

Copied!
53
0
0

Texte intégral

(1)

Présentation de Ruby

Rencontres Mondiales du Logiciel Libre

Mont-de-Marsan, mercredi 2 juillet 2008

(2)

page 2 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat

-Présentation de Ruby

(3)

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

(4)

page 2 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat

-Présentation de Ruby

(5)

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

(6)

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 ?

(7)

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

(8)

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

(9)

JRuby

(http://jruby.codehaus.org/) écrit en JAVA, soutenu par Sun

rubinius

(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 Smalltalk

Cardinal

(http://cardinal2.rubyforge.org/) une VM permettant de tourner sous Parrot

Plusieurs implémentations du langage

page 5 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat

(10)

-JRuby

(http://jruby.codehaus.org/) écrit en JAVA, soutenu par Sun

rubinius

(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 Smalltalk

Cardinal

(http://cardinal2.rubyforge.org/) une VM permettant de tourner sous Parrot

Plusieurs implémentations du langage

page 5 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat

-JRuby

rubinius

IronRuby

Maglev

Cardinal

...

(11)

JRuby

(http://jruby.codehaus.org/) écrit en JAVA, soutenu par Sun

rubinius

(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 Smalltalk

Cardinal

(http://cardinal2.rubyforge.org/) une VM permettant de tourner sous Parrot

Plusieurs implémentations du langage

page 5 sur 33 RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat

(12)

-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

(13)

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

(14)

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

(15)

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...'

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

(25)

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

(26)

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

(27)

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]}"

(28)

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,"

(29)

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")

(30)

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"

(31)

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")

(32)

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

(33)

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

(34)

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

(35)

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

(36)

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

(37)

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

(38)

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

(39)

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

(40)

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

(41)

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

(42)

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)

(43)

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

(44)

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)

(45)

page 27 sur 33

Se mettre à Ruby : irb

(46)

-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)

(47)

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

(48)

page 30 sur 33

Fin de la présentation

RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat

(49)

page 30 sur 33

Fin de la présentation

RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat

-?

(50)

page 30 sur 33

Fin de la présentation

RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat

(51)

page 32 sur 33

Fin de la présentation

RMLL 2008 MontdeMarsan Présentation de Ruby Guillaume “Zifro” Desrat

(52)

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/

(53)

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

Références

Documents relatifs

En réalité mon étude semble indiquer que, même dans les cas de publications considérées comme inacceptables par les participants, ces derniers ont eu plus tendance à

(scaling, translation and rotation). After this normalization, each 3D point cloud is scaled to be enclosed in the same bounding sphere with a radius of 1, centered at the origin,

Les prises de vues aériennes et les couvertures topogra phiques récentes montrent en effet une différence légère mais sensible (supérieure à 1°) dans les

Trois données expérimentales convergentes nous suggèrent qu’UCP1 pourrait participer à la fonction contractile de ces cellules : (1) le contenu en UCP1 de l’utérus est augmenté

Outre les coutelas et les poignards miniaturisés, d'autres objets de dimensions réduites se rencontrent parmi le mobilier des sépultures gallo-romaines du Limousin

Furthermore, the TFW can be successfully integrated in the dimensioning problem of the actuators, the gearboxes and the winches of a CDPR, supposing the locations of the cable

For this purpose, we think to improve the precision of the elderly location by using the genetic algorithm in the anchors selection phase in order to increase the

Les fragments de parement encore en place fournissent quelques renseignements précieux concernant non seulement l’agencement des scènes d’offrandes, mais aussi les apparences du