2010-07-07 3 views
5

Estoy intentando agregar nuevos métodos a un objeto dinámicamente.cómo crear métodos a partir de matrices o hashes en perl6

siguiente código funciona bien:

use SomeClass; 

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

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

$obj.ping; 

esta imagen Impresiones "Pong" como se esperaba, mientras que el siguiente no funcionará como se esperaba:

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; 

imprimirá ya sea 111 o 333.

¿Alguien podría explicar lo que me estoy perdiendo o por qué los resultados son diferentes de lo que esperaba?

Respuesta

8

Rakudo tuvo algunos problemas con el intercambio accidental de variables léxicas, lo que pudo haber causado su problema (la referencia del código se cierra sobre $v). Con la versión de desarrollo actual de Rakudo (y por lo tanto en la próxima versión, y en la versión "Rakudo Star" también), este código funciona:

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; 

Salida:

1 
2 
3 

Tenga en cuenta que los espacios en blanco entre las nombre del método y paréntesis no está permitido.

+0

gracias por esta información. utilicé la última versión mensual. –

Cuestiones relacionadas