2011-08-12 3 views

Répondre

5

C'est la représentation par défaut d'un objet Proc. Parce que "Abder-Rahman" est entre accolades, Ruby pense que vous définissez un bloc. Vouliez-vous dire mettre str.call dans votre définition de fonction? Cela devrait appeler votre bloc et retourner l'expression de chaîne que vous avez définie à l'intérieur.

+1

cela lancerait une exception, car la méthode est définie pour attendre un bloc, pas d'arguments normaux. – numbers1311407

+0

Oups. Bonne prise, fixation ... – plasticsaber

2

Vous passez un bloc à la méthode, comme indiqué par le préfixe & et comment vous l'appelez. Ce bloc est ensuite converti en Proc interne.

puts str.call dans votre méthode afficherait la chaîne, bien que la raison pour laquelle vous voudriez définir la méthode de cette manière est une autre question.

Voir Proc: http://www.ruby-doc.org/core/classes/Proc.html

4

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"