/ / Wywołanie metody Perl bez nawiasów - perl, metody, nawiasy

Wywołanie metody Perla bez nawiasów - perl, metody, nawiasy

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 № 1

Myś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.