2010-07-07 49 views
5

Tôi đang cố thêm các phương thức mới vào một động lực đối tượng.cách tạo phương thức từ mảng hoặc băm trong perl6

Tiếp theo mã số hoạt động tốt:

use SomeClass; 

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

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

$obj.ping; 

này in "pong" như mong đợi, trong khi sau đây sẽ không hoạt động như mong đợi:

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; 

sẽ in hoặc 111 hoặc 333.

Bất cứ ai có thể giải thích những gì tôi đang thiếu hoặc lý do tại sao kết quả khác với những gì tôi đã mong đợi?

Trả lời

8

Rakudo có một số vấn đề vô tình chia sẻ các biến từ vựng quá háo hức, điều này có thể gây ra sự cố của bạn (tham chiếu mã đóng trên $v). Với phiên bản phát triển hiện nay của Rakudo (và do đó trong phiên bản tiếp theo, và trong "Rakudo Star" phát hành quá), mã này hoạt động:

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; 

Output:

1 
2 
3 

Lưu ý rằng khoảng trắng giữa tên phương thức và dấu ngoặc đơn không được phép.

+0

cảm ơn bạn đã cung cấp thông tin này. tôi đã sử dụng bản phát hành hàng tháng mới nhất. –

Các vấn đề liên quan