Pour apporter des précisions supplémentaires:
Joey dit que le comportement de retour de Proc.new
est surprenant. Cependant, lorsque vous considérez que Proc.new se comporte comme un bloc, cela n'est pas surprenant car c'est exactement la façon dont les blocs se comportent. les lambas par contre se comportent plus comme des méthodes.
Cela explique en fait pourquoi les Procs sont flexibles en matière d'arité (nombre d'arguments), contrairement aux lambdas. Les blocs ne nécessitent pas que tous leurs arguments soient fournis, contrairement aux méthodes (sauf si une valeur par défaut est fournie). Bien que fournir l'argument lambda par défaut ne soit pas une option dans Ruby 1.8, il est maintenant pris en charge dans Ruby 1.9 avec la syntaxe lambda alternative (comme indiqué par webmat):
concat = ->(a, b=2){ "#{a}#{b}" }
concat.call(4,5) # => "45"
concat.call(1) # => "12"
Et Michiel de Mare (l'OP) a tort sur les Procs et lambda se comportant de la même manière avec l'arité dans Ruby 1.9. J'ai vérifié qu'ils maintiennent toujours le comportement de 1,8 comme spécifié ci-dessus.
break
les instructions n'ont en fait pas beaucoup de sens dans Procs ou lambdas. Dans Procs, la pause vous renverrait de Proc.new qui a déjà été effectué. Et cela n'a aucun sens de rompre avec un lambda car c'est essentiellement une méthode, et vous ne vous sépareriez jamais du niveau supérieur d'une méthode.
next
, redo
Et raise
ont le même comportement dans les deux procs et lambdas. Alors que ce retry
n'est pas autorisé dans les deux cas et entraînera une exception.
Et enfin, la proc
méthode ne doit jamais être utilisée car elle est incohérente et a un comportement inattendu. Dans Ruby 1.8, il retourne en fait un lambda! Dans Ruby 1.9, cela a été corrigé et il renvoie un Proc. Si vous souhaitez créer un Proc, restez avec Proc.new
.
Pour plus d'informations, je recommande fortement le langage de programmation Ruby d' O'Reilly qui est ma source pour la plupart de ces informations.