Le problème est que vous avez déclaré que la méthode « print_string
» prend un argument de bloc (nom de prêter à confusion « str
») et vous imprimez simplement le proc lui-même. Vous auriez probablement aimé appeler la procédure donnée pour voir la valeur de chaîne retourne:
def call_proc(&proc)
proc.call
end
call_proc { 'Foobar' }
# => "Foobar"
Qu'est-ce que vous avez découvert est le sucre de syntaxe que si vous décorez le dernier argument d'une définition de méthode avec une esperluette &
puis il sera lié à l'argument de bloc de l'appel de méthode. Une autre façon d'accomplir la même tâche est la suivante:
def call_proc2
yield if block_given?
end
call_proc2 { 'Example' }
# => 'Example'
Notez également que les procédures peuvent être traitées directement sous forme d'objets à l'aide Proc
objects (ou l'alias « lambda » pour le constructeur Proc):
p1 = Proc.new { 'Foo' }
p1.call # => "Foo"
p2 = lambda { 'Bar' }
p2.call # => "Bar"
cela lancerait une exception, car la méthode est définie pour attendre un bloc, pas d'arguments normaux. – numbers1311407
Oups. Bonne prise, fixation ... – plasticsaber