Ruby Blocks, Procs et Lambdas

Les blocks, Procs et Lambdas dans Ruby

Partagez sur:

Aussi appelé closure dans certains langages de programmation, les blocks, procs et lambdas permettent de passer du code comme paramètre à une méthode.

Les Blocks

Les blocks font partir de la magie offerte par Ruby, un block est tout simplement une suite d’instruction entourer par les mots-clés do/end pour sa forme multi-ligne et {} pour sa forme uni-ligne ; un block est aussi une méthode anonyme qu’on peut passer comme paramètre à n’importe quelle méthode.

En Ruby toute méthode peut prendre un et un seul block comme paramètre.

Un block peut recevoir des arguments, si c’est le cas, ils sont placés entre des pipes |, il tient compte du nombre d’argument passer en paramètre.

Exemple 1 :

def hello
    yield
end

hello {puts "Hello world"}

Exemple  2 :

def hello(name)
    yield(name)
end

hello("Amos") {|name| puts "Hello #{name} "}

Mise au point :

Dans les deux exemples précédent, le mot-clé yield est apparu comme par magie, à quoi sert réellement ce mot clé yield ? c’est un mot clé Ruby qui permet de capter et exécuter un block passé en paramètre à l’endroit ou il es appelé.

Lorsque vous utilisez yield dans une méthode celle là s’attende a avoir comme paramètre un block, dans le cas contraire, une exception sera levée, donc pour gérer cette exception, il est conseillé de conditionné l’utilisation du yield grâce à la méthode if block_given ?

Il est possible de passer un paramètre à yield lors de son appel, cet paramètre est en envoyé comme argument au block et devient accessible dans tout le corps du block.

Les Procs

On a dit que dans Ruby que tout est objet, ce qui n’est pas totalement vrai, car les blocks font exception à cette règle, vu qu’un block ne peut pas être sauvegarder dans une variable.

Donc c’est pour pouvoir sauvegarder les block, un nouveau objet à été intégré dans Ruby, c’est le Proc.

En gros un Proc est un objet Ruby qui permet de sauvegarder un block et pour pouvoir l’utiliser antérieurement. Cette variable est considérer comme une méthode.

Pour créer un Proc, on crée une nouvelle instance de l’objet Proc en faisant : Proc.new ou proc suivi d’un block.

Exemple :

hello = Proc.new {puts « hello world. »}

hello.call

Pour exécuter le code sauvegarder dans un proc, il suffit d’appeler la méthode call sur l’objet proc.

Comme les blocks,  les procs peuvent aussi recevoir des arguments :

Exemple  :

name = "Amos"

hello = Proc.new {|name| puts "Hello #{name} "}

hello.call(name)

 

Il est important de noter qu’un Proc capte les variables présentes dans son scope lors de sa création.

Exemple  :

message = Proc.new {|name| puts « Hello #{name} »}

def hello
    yield(name)
end

hello(&message)

Dans l’exemple précédent, nous avons passer un proc comme paramètre à une méthode, pour se faire nous avons préfixé le proc le signe &, ceci permet de convertir un proc en block et un block en proc.

Exemple  :

def hello(&message)

   message.call
end

hello {puts "Hello world"}

Dans l’exemple précédent nous avons récupéré un block comme proc dans la déclaration de notre méthode, donc cela nous permet de ne pas utiliser la mot clé yield.

L’intérêt d’un proc par rapport à un block, sait qu’on peut en passer plusieurs comme paramètres à une méthode.

Exemple :

bonjour = Proc.new {puts "Bonjour !" }

bonsoir = Proc.new {puts "Bonsoir"}

def hello(proc1 , proc2)
    proc1.call
    proc2.call
end

hello(bonjour, bonsoir)

Les lambdas

Un lambda c’est un proc, mais qui se comporte un peu différemment, dans Ruby il n’ya pas un objet spécifique au lambda, il hérite de la class Proc.

Pour créer un lambda il ya deux façons de le faire :

1ère façon :

hello = lamba {puts "Hello world."}

2ème façons : (dans les nouvelles versions de ruby)

hello = -> {puts "Hello world"}

 

Différence entre Proc et Lambda

Dans ce cours il est dit qu’un Proc  et un Lambda sont pareils, mais juste une petite différence dans leurs comportements :

Proc :

– Le proc ne tient pas compte du nombre de paramètres passé,

– Le return au sein d’un proc bloque exécution de la méthode appelante

Lambda :

– Il tient compte du nombre de paramètres passé,

– Le return au sein d’un lambda ne bloque pas l’exécution du code.

LIRE AUSSI: Ce que vous devriez savoir sur les méthodes .nil ?, .blank ?, .empty ?, present ? dans ruby on rails

Amonce DEMBELE


Partagez sur: