2016-02-13 1 views
2

Dans la première déclaration ci-dessous, Pry renvoie un objet d'apparence normale. Dans la seconde, Pry spécifie un lambda dans l'objet, mais ajoute également @(pry) avec une référence à la ligne dans la session Pry (:37). Pourquoi la première valeur de retour ne contient-elle pas @(pry)? Ou, inversement, pourquoi la deuxième valeur de retour le contient-elle?Pourquoi Pry met-il en forme ces valeurs de retour différemment?

{}.to_proc 
# => #<Proc:0x9b3fed0> 

lambda {} 
# => #<Proc:[email protected](pry):37 (lambda)> 

Répondre

2

Le deuxième exemple est un littéral, et le proc (lambda) est créé là dans le code Ruby, où il obtient l'emplacement de la source.

Dans le premier exemple, le processus est créé en exécutant une méthode C (to_proc). Le code C est compilé dans l'interpréteur Ruby, qui devient un code binaire, et il n'est pas logique de décrire l'emplacement C à la place d'un emplacement source Ruby. En fait, vous n'obtiendrez pas non plus l'emplacement source de la méthode (qui n'est pas la même que l'emplacement source du processus généré, mais qui devrait en être proche, s'ils devaient l'être):

{}.method(:to_proc).source_location # => nil 

Cependant, si la source est écrite dans le cadre d'un code Ruby, vous obtenez l'emplacement source:

irb(main):001:0> def to_proc 
irb(main):002:1> Proc.new{} 
irb(main):003:1> end 
=> :to_proc 
irb(main):004:0> {}.to_proc 
=> #<Proc:[email protected](irb):2> 
1

Ceci n'a rien à voir avec Pry. C'est ce que vous obtenez lorsque vous appelez inspect sur ces deux processus. Je ne suis pas sûr à 100%, mais j'ai une théorie. Dans le deuxième exemple, vous passez un bloc à lambda. Bien que vous n'ayez pas de code à l'intérieur du bloc, vous le feriez normalement, et lors du débogage (ce qui est généralement utilisé pour inspect), les numéros de ligne sont importants.

Dans le premier exemple, cependant, il n'y a pas de bloc. Vous appelez Hash#to_proc sur un Hash vide (ce qui n'est pas important, vous obtenez le même résultat avec Symbol#to_proc etc.), et donc il n'y a pas de code pour associer un numéro de ligne à; un numéro de ligne n'aurait même pas vraiment de sens.

Vous pouvez voir où cela se produit dans la fonction proc_to_s en proc.c, soit dit en passant.