2010-02-04 13 views
6

Próbuję dowiedzieć się, jak wykonać pracę odwołań funkcji dla modułu Perla. Wiem, jak to zrobić poza modułem, ale w środku? Rozważmy kod taki jak ten:Jak napisać odwołanie do funkcji w module Perla?

==mymodule.pm== 
1 sub foo { my $self = shift; ... } 
2 sub bar { my $self = shift; ... } 
3 sub zip { 
4 my $self = shift; 
5 my $ref = \&foo; 
6 $self->&$foo(); # what syntax is appropriate? 
7 } 
==eof=== 

Spójrz na linie 5-6 powyżej. Jaka jest poprawna składnia dla (1) zdefiniowania odwołania do funkcji w pierwszej kolejności i (2) dereferencji?

Odpowiedz

8

Jeśli $ref jest metoda (oczekuje $self jako pierwszy argument) i chcesz to nazwać na swój $self, składnia jest:

$self->$ref(@args) 
+1

Ważne jest, aby pamiętać w tym stylu wywołującego jest to, że jest '$ self' nie używane do określenia, która metoda wywołać (jak to zwykle bywa w przypadku wywoływania metody OO-style) - metoda jest określana wyłącznie z '$ ref', a' $ self' jest jedynie przekazywane jako pierwszy argument $ ref. Porównajmy to, jeśli '$ ref' jest po prostu nazwą metody, w którym to przypadku powinniśmy zacząć szukać tej metody w' $ self', a następnie w drzewie dziedziczenia. – Ether

+0

Przegłosowano na Randal "one-L" Schwartz! Yay! –

+8

@ Jonathan: nie zmieniajmy SO [perl] w grupę śliniących się groupies .. fanboyi Jona Skeeta są wystarczająco złe. :/ – Ether

20

TMTOWTDI

Definiowanie odniesienie funkcję:

$ref = \&subroutine; 
$ref = sub { BLOCK }; 
$ref = "subroutineName"; # or $ref = $scalarSubroutineName 

dereferencing:

$ref->(@args); 
&$ref; 
&{$ref}(@args); 
6

pomocą następujących:

$self->$ref(); 

Z tej składni $ref może być odniesienie do podprogramu a nawet łańcuch nazwą metody się połączyć, np ,

my $ref = "foo"; 
$self->$ref(); 

Należy pamiętać, że oba mają nieco różne semantykę w odniesieniu do dziedziczenia.

Jeśli nie przechodzą jednoznacznych argumentów, nawiasy są opcjonalne:

$self->$ref; # also flies 

przeciwnym razie użyj

$self->$ref($arg1, \%arg2, @others); 
Powiązane problemy