2010-07-07 13 views
5

Ich versuche, einem Objekt dynamisch neue Methoden hinzuzufügen.So erstellen Sie Methoden aus Arrays oder Hashes in perl6

Code Nach funktioniert gut:

use SomeClass; 

my $obj = SomeClass.new; 
my $blah = 'ping'; 
my $coderef = method { say 'pong'; } 

$obj.^add_method($blah, $coderef); 

$obj.ping; 

dieses prints "Pong", wie erwartet, während die folgenden werden nicht wie erwartet:

use SomeClass; 

my $obj = SomeClass.new; 
my %hash = one => 1, two => 2, three => 3; 

for %hash.kv -> $k, $v { 
    my $coderef = method { print $v; } 
    $obj.^add_method($k, $coderef); 
} 

$obj.one; 
$obj.two; 
$obj.three; 

druckt entweder 111 oder 333.

Könnte jemand erklären, was ich vermisse oder warum die Ergebnisse von dem abweichen, was ich erwartet habe?

Antwort

8

Rakudo hatte einige Probleme bei der versehentlichen Freigabe von lexikalischen Variablen, die möglicherweise Ihr Problem verursacht haben (die Code-Referenz schließt über $v). Mit der aktuellen Entwicklungsversion von Rakudo (und damit in der nächsten Version, und in der "Rakudo Star" Release auch), dieser Code funktioniert:

class SomeClass { }; 

my $obj = SomeClass.new; 
my %hash = one => 1, two => 2, three => 3; 

for %hash.kv -> $k, $v { 
    my $coderef = method { say $v; } 
    $obj.^add_method($k, $coderef); 
} 

$obj.one; 
$obj.two; 
$obj.three; 

Ausgang:

1 
2 
3 

Beachten Sie, dass Leerzeichen zwischen Methodenname und Klammern sind nicht zulässig.

+0

danke für diese Info. Ich habe die neueste monatliche Version verwendet. –

Verwandte Themen