2013-09-25 19 views
5

Tôi có bảng công văn mà tôi muốn khởi tạo chỉ một lần và chỉ được sử dụng bởi một hàm. Tôi đã hy vọng di chuyển bảng công văn ra ngoài chương trình con và vào cùng một khối ẩn danh, nhưng vì bảng công văn sử dụng các bao đóng để gọi các phương thức cho đối tượng được truyền vào hàm, di chuyển bảng bên ngoài hàm tách nó khỏi quyền truy cập đối tượng . Tôi có những lựa chọn nào khác cho bảng công văn này?Bảng gửi địa phương tĩnh với các cuộc gọi OO trong vòng đóng

Tôi đang sử dụng Perl 5.8, rất tiếc là tôi không thể sử dụng biến số state.

sub foo { 
    my ($self, $var) = @_; 

    my %funcs = (
    a => sub { $self->_a() }, 
    b => sub { $self->_b() }, 
    ... 
); 

    return $funcs{$var}->(); 
} 
+0

Đóng cửa duy nhất tôi có thể thấy trong ví dụ là hơn '$ tự' trong các người đăng ký ẩn danh - có những người khác trong mã thực không? Nếu có, vui lòng thêm ví dụ. –

Trả lời

8

Chức năng của bạn trong bảng công văn được đóng trên $self. Nếu bạn vượt qua số $self làm thông số, bạn có thể giải quyết vấn đề đó. Lưu ý rằng các biến số state không thực sự bị đóng trên $self và cũng sẽ yêu cầu thông số rõ ràng.

my %funcs = (
    a => sub { shift->_a }, # these are like anonymous methods 
    b => sub { shift->_b }, 
); 

sub foo { 
    my ($self, $var) = @_; 
    my $meth = $funcs{$var} || die "There is no entry $var"; 
    return $self->$meth(); # sugary syntax 
} 

Đây là một cuộc biểu tình tại sao state sẽ là một ý tưởng tồi:

use 5.010; 
package Foo; 
sub new { my ($c, $v) = @_; bless \$v, $c } 

sub foo { 
    my ($self) = @_; 
    state $cb = sub { say $$self }; 
    $cb->(); 
} 

Foo->new($_)->foo for 1..3; 

Output:

1 
1 
1 

Tiểu bên trong là một đóng cửa, nhưng việc khởi tạo $cb chỉ được thực hiện Một lần. Vì vậy, đóng cửa trên $self là lần đầu tiên.

+0

Cảm ơn bạn đã giải thích! –

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