/ / Perl метод без скоби - perl, методи, скоби

Метод на обаждане на Perl без скоби - Perl, методи, скоби

Един от моите проекти съдържа много прости методи за обаждания. Бих искал да повикайте ги без скоби, за да избегнете бъркотията и да направите честите модификации по-лесни.

Направих следните тестове.

С скоби (очевидно работи):

my $something = [1, 2, 3];

my $dumper = Data::Dumper->new([$something]);

$dumper->Indent(0);

say $dumper->Dump();

Сега без скоби (работи само за методи без параметри)

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!

Изпробвах и непрякото синтаксис. Знам за проблемите му, но ако това щеше да стане, това би могло да бъде вариант. Но това не е така.

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

Има ли начин да се наричат ​​методи последователнобез скоби? Не виждам истинска причина, поради която Perl не би го позволил, защото не изглежда да има някаква двусмислие. За подводниците имаме "subs subs", може би нещо подобно съществува за методите?

И за пълнота, има ли начин да се избегне "say2" под в горния пример и все още се обаждат без скоби?

Може би има някакъв вид хакване или трик?

Отговори:

4 за отговор № 1

Това, което мисля, че говорим тук, е prototyping - можете да укажете прототип за подпрограма, която показва какви аргументи - и видове - очакват. Ако нямате прототип, perl трябва да познае какви са аргументите и как да ги използват.

Не винаги получава това право - така в примера ви, ако:

 say Dump $dumper;

Perl не знае дали say получава два аргумента или един. Трябва да се отгатне и не винаги предполага правилно. say всъщност всъщност е доста сложно в това, което може да предприеме, защото можете да му дадете набор от неща за печат. Но ти можеш също дайте му дръжка на файла, за да я отпечатате - начинът, по който казва разликата е чрез прототип.

Подпрограми с един аргумент обикновено е доста очевидно, че имате под и аргумент, но всичко друго е потенциално двусмислено.

Но като perldoc perlsub казва:

"Извикванията на методи също не се влияят от прототипите, тъй като функцията, която трябва да се извика, е неопределена по време на компилация, тъй като точният код, наречен, зависи от наследяването"

Така че краткият отговор е - не можете да го направите, просто използвайте скобите.