LINUX.ORG.RU

Вызов методов в perl

 


0

1

В перле есть два идентичных способа вызвать метод объекта:

1: my $c = method_name MyClass;
2: my $c = MyClass->method_name;

Когда читал книжки по перлу, толи в lama book, толи в alpaca book, встретил упоминание о том, что второй метод лучше, чем первый. Точно не помню, чем. Бегло порылся в книжках, не смог найти это место. Собственно, какие есть подводные камни в использовании первого метода вместо второго?

☆☆☆☆☆

Ответ на: комментарий от sdio

Да.
По сабжу, на сколько мне известно, без разницы, но лучше придерживаться одного стиля.

anonymous
()
Ответ на: комментарий от anonymous

ну это понятно. В чем второй лучше-то? Понятно, что «there is more than one way to do it». В этом весь перл. Но я спрашиваю потому, что помню, что в книжках настойчиво рекомендовали отказаться от первого варианта.

DELIRIUM ☆☆☆☆☆
() автор топика
Последнее исправление: DELIRIUM (всего исправлений: 1)
Ответ на: комментарий от DELIRIUM

Не помню в какой книге, но читал, что без разницы. Главное, что бы смотрелось хорошо.
$dog->say(«afaf»)
say $dog «af af»
Первый больше похожь на разговорный вариант, наверное, поэтому.

anonymous
()

man perlobj

Invoking Class Methods

Indirect Object Syntax

Outside of the file handle case, use of this syntax is discouraged, as it can confuse the Perl interpreter. See below for more details.

Perl suports another method invocation syntax called «indirect object» notation. This syntax is called «indirect» because the method comes before the object it is being invoked on.

This syntax can be used with any class or object method:

my $file = new File $path, $data;
save $file;

We recommend that you avoid this syntax, for several reasons.

First, it can be confusing to read. In the above example, it's not clear if «save» is a method provided by the «File» class or simply a subroutine that expects a file object as its first argument.

When used with class methods, the problem is even worse. Because Perl allows subroutine names to be written as barewords, Perl has to guess whether the bareword after the method is a class name or subroutine name. In other words, Perl can resolve the syntax as either «File->new( $path, $data )» or «new( File( $path, $data ) )».

To parse this code, Perl uses a heuristic based on what package names it has seen, what subroutines exist in the current package, what barewords it has previously seen, and other input. Needless to say, heuristics can produce very surprising results!

Older documentation (and some CPAN modules) encouraged this syntax, particularly for constructors, so you may still find it in the wild. However, we encourage you to avoid using it in new code.

You can force Perl to interpret the bareword as a class name by appending "::" to it, like we saw earlier:

my $file = new File:: $path, $data;
arsi ★★★★★
()

Кстати, в одном обсуждении на PerlMonks выяснилось, что синтаксис вида «Class::->method» ещё и выполняется быстрее всего.

AITap ★★★★★
()
Ответ на: комментарий от DELIRIUM

собственно, всё логично. в том же мане сказано, что Class::->new() и 'Class'->new() — вызов метода класса, без вариантов. с остальными формами записи могут быть нюансы (например, Class — это функция, или файлхендлер), и интерпретатор их все проверяет.

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.