Jeden z moich projektów zawiera wiele prostych wywołań metod. chciałbym zadzwoń do nich bez nawiasów, aby uniknąć bałaganu i ułatwić częste modyfikacje.
Zrobiłem następujące testy.
Z nawiasami (oczywiście działa):
my $something = [1, 2, 3];
my $dumper = Data::Dumper->new([$something]);
$dumper->Indent(0);
say $dumper->Dump();
Teraz bez nawiasów (działa tylko dla metod bez parametrów)
my $something = [1, 2, 3];
# my $dumper = Data::Dumper->new [$something]; # syntax error
my $dumper = Data::Dumper->new([$something]);
# $dumper->Indent 0; # Number found where operator expected
$dumper->Indent(0);
say $dumper->Dump; # works!
Przetestowałem również składnię pośrednią. Wiem o jego problemach, ale jeśli to zadziała, może to być opcja. Ale tak nie jest.
sub say2 { say @_; return; }
my $something = [1, 2, 3];
my $dumper = new Data::Dumper [$something]; # works!
# Indent $dumper, 0; # No error, but doesn"t do what supposed to happen
Indent $dumper(0); # works
# say Dump $dumper; # say() on unopened filehandle Dump
say2 Dump $dumper; # works
Czy istnieje sposób na spójne wywoływanie metodbez nawiasów? Nie widzę prawdziwego powodu, dla którego Perl by na to nie pozwolił, ponieważ nie wydaje się, aby istniała jakaś dwuznaczność.
A jeśli chodzi o kompletność, czy istnieje sposób na uniknięcie sub-powiedzenia „say2” w powyższym przykładzie i wciąż wywoływanie bez nawiasów?
Może jest jakiś rodzaj hakowania lub sztuczki?
Odpowiedzi:
4 dla odpowiedzi № 1Myślę, że o tym tutaj rozmawiamy prototyping
- możesz określić prototyp podprogramu, który pokazuje, jakich argumentów - i typów - oczekuje. Jeśli nie stworzysz prototypu, perl musi odgadnąć, jakie są typy argumentów i jak ich używać.
Nie zawsze ma to rację - w twoim przykładzie, jeśli:
say Dump $dumper;
Perl nie wie, czy say
dostaje dwa argumenty lub jeden. Musi zgadywać i nie zawsze zgaduje poprawnie. say
w szczególności jest dość skomplikowane w tym, co może zrobić, ponieważ możesz nadać mu wiele rzeczy do wydrukowania. Ale ty możesz również nadaj mu uchwyt do drukowania - sposób, w jaki mówi, że różnica polega na prototypie.
Podprogramy z pojedynczym argumentem są zwykle dość oczywiste, że masz sub i argument, ale wszystko inne jest potencjalnie niejednoznaczne.
Ale jak perldoc perlsub
mówi:
„Prototypy nie wpływają również na wywołania metod, ponieważ wywoływana funkcja jest nieokreślona w czasie kompilacji, ponieważ dokładny kod zwany zależy od dziedziczenia”
Krótka odpowiedź brzmi - nie możesz tego zrobić, po prostu użyj nawiasów.