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
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.
C'est le travail de &
de transformer un proc en block
@staff = ["Edmund", "Roger", "Jane"]
printer = Proc.new { |user| puts user }
@staff.each(&printer)
@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
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