2009-09-28 8 views
11

Wszyscy powinniśmy znać problemy związane z prototypes w Perlu. Oto dwa duże modele:Na ile sposobów można wywołać podprogram i zignorować jego prototyp w Perlu?

  • nie działają jak prototypy w innych językach, więc ludzie źle je rozumieją.
  • nie mają one zastosowania do wszystkich sposobów wywoływania podprogramu.

Drugi przedmiot to ten, który mnie interesuje w tej chwili.

Znam dwa sposoby obalić/obejścia/ignore wykonanie prototypu przy wywołaniu podprogramu:

  • połączeń sub jako metoda. Foo->subroutine_name();
  • Zadzwoń na okręt podwodny z wiodącym znakiem &. &subroutine_name();

Czy są jakieś inne interesujące przypadki, które przeoczyłem?

UDPATE:

@brian d Foy, nie szczególnie chcą uniknąć prototypy, ale zastanawiałem się, "jak wiele sposobów są tam, aby to zrobić?" Zadaję to pytanie z ciekawości.

@ jrockway, Zgadzam się z tobą i uważam, że masz jaśniej i bardziej zwięźle opisany mój pierwszy punkt dotyczący problemów z prototypami, że ludzie źle je rozumieją. Być może problem leży w oczekiwaniach programistów, a nie w funkcji. Ale tak naprawdę jest to pytanie filozoficzne, jakiego nie chcę mieć.

+8

To nie jest "problem". Prototypy są wskazówkami dla lexera, a nie ramy sprawdzania poprawności danych. Zrozum to i nie będziesz miał problemów. – jrockway

+1

Odsyłacz do pytania, gdzie jest to omówione bardziej szczegółowo: http://stackoverflow.com/questions/297034/why-are-perl-function-prototypes-bad – Ether

+0

Dlaczego próbujesz ignorować prototyp? –

Odpowiedz

11

Zadzwoń przez odwołanie do podprogramu.

sub foo($) { print "arg is $_[0]\n" } 
my $sub = \&foo; 
$sub->(); 

Nazwać przed Perl widział prototyp (ważne, ponieważ Perl nie sprawi, że deklarują subs przed użyciem):

foo(); 
sub foo($) { print "arg is $_[0]\n" } 
+3

Co ciekawe, 'print prototype ($ sub), \ n"; 'nadal drukuje" $ "(prawidłowy prototyp). –

+1

Druga daje ostrzeżenie: główna :: foo() została wywołana zbyt wcześnie, aby sprawdzić prototyp ... – oylenshpeegul

+0

Wygląda na to, że każda rozmowa jest określana w krokach uruchomionych wokół nich.Ma to sens, ponieważ są przetwarzane w czasie kompilacji. – daotoad

3

Korzystanie składnię goto &name.

3

Typ-glob.

sub foo($) { print "arg is $_[0]\n" } 
*foo{CODE}() 

także rozważyć Bar-> foo() przepisany w notacji pośrednie:

foo Bar 

więcej? daj spokój, przynieś to.

Powiązane problemy