Skip to content

Instantly share code, notes, and snippets.

@yannvery
Created January 20, 2016 15:53
Show Gist options
  • Save yannvery/7aa4c937e882955a1749 to your computer and use it in GitHub Desktop.
Save yannvery/7aa4c937e882955a1749 to your computer and use it in GitHub Desktop.
Proc and lambda ( in french )

Proc & Lambdas

1 - Proc

Creation

Un objet proc permet de stocker du code et peut être associé à une variable.

my_proc = Proc.new { puts "Hello" }

Un objet proc est utilisé avec la méthode call :

my_proc.call 
# => Hello

On peut aussi créer un objet Proc de la manière suivante :

my_proc = Proc.new do
  puts "Hello"
end
my_proc.call
# => Hello

Utilisation

my_proc = Proc.new {|name| puts "Hello #{name}" }
@staff = ["Edmund", "Roger", "Jane"] 

def hello_all(proc)
  @staff.each do |name|
    proc.call(name)
  end
end

hello_all(my_proc)

# => Hello Edmund
# => Hello Roger
# => Hello Jane

Note : un block ne vérifie pas le nombre d'arguments. Les arguments supplémentaires sont supprimés.

Bonus

Utiliser un proc comme un block

C'est le travail de & de transformer un proc en block

@staff = ["Edmund", "Roger", "Jane"]
printer = Proc.new { |user| puts user }
@staff.each(&printer)

Utiliser un symbole comme un proc

@users.map { |user| user.full_name }
@users.map(&:full_name)

par contre

@users.map(&:celebrity.full_name)
NoMethodError: undefined method `full_name' for :celebrity:Symbol

2 - Lambda

Un lambda est une autre façon de créer un proc, d'ailleur un lambda est un proc.

Ruby 1.9

my_proc = lambda { puts "Hello" }
my_proc.call
# => "Hello

Ruby > 2.0

my_proc = -> { puts "Hello }
my_proc.call 
# => Hello

Avec un argument :

my_proc = -> (name) { puts "Hello #{name}" }
my_proc.call('Janice')
# => Hello Janice

Note : un lambda vérifie le nombre d'arguments return n'interromp pas l'exécution du code contrairement au proc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment