Afin de fournir des précisions:
Joey dit que le retour de comportement de l' Proc.new
est surprenant. Cependant, quand vous considérez que Proc.la nouvelle se comporte comme un bloc, ce n'est pas surprenant, c'est exactement la façon dont les blocs se comporter. lambas sur l'autre main se comportent plus comme des méthodes.
Ce fait explique pourquoi les Procs sont flexibles quand il s'agit d'arité (nombre d'arguments) alors qu'elles ne le sont pas. Les blocs de ne pas exiger de tous leurs arguments sont fournis, mais les méthodes ne sont (à moins qu'une valeur par défaut est fournie). Tout en fournissant lambda argument par défaut n'est pas une option en Ruby 1.8, il est maintenant pris en charge dans Ruby 1.9 avec l'alternative lambda syntaxe (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) est incorrect sur le Proc et lambda de se comporter de la même avec une arité de Ruby 1.9. J'ai vérifié qu'ils maintiennent encore le comportement de 1,8 comme indiqué ci-dessus.
break
états ne fait pas beaucoup de sens dans les deux Procs ou lambdas. Dans le Procs, la rupture serait de retour vous de Proc.nouveau ce qui a déjà été réalisé. Et il ne ferait aucun sens de rompre avec un lambda puisqu'il s'agit essentiellement d'une méthode, et vous ne serait jamais pause de haut niveau d'une méthode.
next
, redo
, et raise
se comportent de la même dans les deux Procs et les lambdas. Alors qu' retry
n'est pas permis dans les deux et déclenche une exception.
Et enfin, l' proc
méthode ne doit jamais être utilisé, car il est incompatible et a un comportement inattendu. En Ruby 1.8 il retourne en fait un lambda! En Ruby 1.9 cela a été corrigé et il renvoie un Proc. Si vous souhaitez créer un Proc, tenez - Proc.new
.
Pour plus d'informations, je vous recommande fortement de O'Reilly Le Langage de Programmation Ruby , qui est ma source pour la plupart de cette information.