Почему я “позвонил слишком рано для проверки прототипа” предупреждения в мой код Perl?

Никто еще не упомянул лучший. Нажмите на имя класса или имя метода и нажатие Ctrl + T .

Вы получаете быструю иерархию типа. Для имени класса Вы видите всю иерархию классов. Для имени метода Вы получаете суперклассы показа иерархии и подклассы с реализациями того метода, который отличают от абстрактных упоминаний или классов, которые не упоминают метод.

Это огромно, когда Вы в объявлении абстрактного метода и быстро хотите видеть, где оно реализовано.

12
задан Sinan Ünür 1 November 2014 в 19:36
поделиться

3 ответа

Вы можете полностью избежать этой проблемы, не используя в первую очередь прототипы:

use strict;

f1();

sub f3 { f2() }

sub f1 {}
sub f2 {}

Не используйте прототипы , если вы не знаете, почему вы их используете:

Все это, конечно, очень мощно, и его следует использовать только в умеренных количествах, чтобы сделать мир лучше.

16
ответ дан 2 December 2019 в 04:33
поделиться

Если вы собираетесь называть его круглыми скобками, зачем вы вообще используете прототипы?

sub f1(){ ... }

f1();

Я бы использовал пустой прототип только для подпрограммы, которая должна работать как константа.

sub PI(){ 3.14159 }

print 'I like ', PI, ", don't you?\n";

Я бы на самом деле не рекомендовал использовать прототипы Perl 5, если только вы не хотите, чтобы ваша подпрограмма вела себя иначе, чем в противном случае.

sub rad2deg($){ ... }

say '6.2831 radians is equal to ', rad2deg 6.2831, " degrees, of course.\n";

В этом примере вам придется использовать круглые скобки, если у них нет опытный образец. В противном случае он получил бы дополнительный аргумент, и последняя строка никогда не была бы напечатана.

2
ответ дан 2 December 2019 в 04:33
поделиться

Отсутствие предупреждения при вызове f2 () из f3 () , по-видимому, является ошибкой.

use strict;
use warnings;

f1();

sub f1 {
    my @a = qw(a b c);
    f2(@a);
}

sub f2(\@) { print $_[0] }

Это печатает " а ". Если вы предварительно объявите f2 () или поменяете порядок определений подпрограмм, он напечатает «ARRAY (0x182c054)».

Что касается разрешения ситуации, это зависит. Мои предпочтения (по порядку) следующие:

  1. Удалить прототипы из определений подпрограмм. Прототипы Perl не работают то, чего от них ожидает большинство людей. Они действительно полезны только для объявления подпрограмм, которые действуют как встроенные. Если вы не пытаетесь расширить синтаксис Perl, не используйте их.
  2. Предварительно объявите подпрограммы перед их использованием. Это позволяет Perl узнать о прототипе до обнаружения каких-либо вызовов.
  3. Измените порядок кода так, чтобы определения подпрограмм появлялись перед любыми вызовами.
  4. Вызов подпрограмм, используя нотацию & foo () , чтобы обойти проверку прототипа.
2
ответ дан 2 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: