Quand utiliser lambda, quand utiliser Proc.new ?

Dans Ruby 1.8, il existe des différences subtiles entre proc/lambda d'une part, et Proc.new d'autre part.

  • Quelles sont ces différences ?
  • Pouvez-vous donner des instructions sur la façon de décider lequel choisir ?
  • Dans Ruby 1.9, proc et lambda sont différents. Quel est le problème ?
请先 登录 后评论

4 réponses

Orion Edwards

La différence de comportement avec return est à mon humble avis la différence la plus importante entre les 2. Je préfère aussi lambda car il est moins typé que Proc.new :-)

请先 登录 后评论
Peeja

Pour développer la réponse d'Accordion Guy :

Remarquez que Proc.new crée un proc out en passant un bloc. Je crois que lambda {...} est analysé comme une sorte de littéral, plutôt qu'un appel de méthode qui passe un bloc. returning depuis l'intérieur d'un bloc attaché à un appel de méthode reviendra de la méthode, pas du bloc, et le cas Proc.new en est un exemple en jeu.

(C'est 1.8. Je ne sais pas comment cela se traduit en 1.9.)

请先 登录 后评论
Community

Proc est plus ancien, mais la sémantique de return est très contre-intuitive pour moi (du moins quand j'apprenais la langue) parce que :

  1. Si vous utilisez proc, vous utilisez très probablement une sorte de paradigme fonctionnel.
  2. Proc peut sortir de la portée englobante (voir les réponses précédentes), qui est essentiellement un goto et de nature hautement non fonctionnelle.

Lambda est fonctionnellement plus sûr et plus facile à raisonner - je l'utilise toujours à la place de proc.

请先 登录 后评论
krusty.ar

Une bonne façon de le voir est que les lambdas sont exécutés dans leur propre portée (comme s'il s'agissait d'un appel de méthode), tandis que les Procs peuvent être considérés comme exécutés en ligne avec la méthode appelante, au moins c'est un bon moyen de décider qui un à utiliser dans chaque cas.

请先 登录 后评论