Почему этот код Perl не является ошибкой - PullRequest
4 голосов
/ 22 октября 2011

Я пишу программу WxPerl и вместо

$panel->SetDropTarget( MyTextDropTarget->new($panel) );

Я написал

$panel->SetDropTarget->( MyTextDropTarget->new($panel) );

и Perl не жаловался. (Perl вызвал некоторую функцию с некоторыми аргументами, и скрипт выдал ошибку с сообщением об ошибке:

Использование: Wx :: Window :: SetDropTarget (THIS, target) в строке ./x.pl 230.

Мне любопытно, как Perl проанализировал «неправильную» версию.

Добавлено редактирование:

Хорошо, так что если $ x = \ & some_function, тогда я понимаю, почему

$x->($arg1, $arg2, ...)

вызывает some_function ($ arg1, $ arg2, .....).

Пример Рунрига - одна из возможностей, но я вполне уверен, что: 1) $ panel содержит ссылку на благословенный объект, а не на строку. 2) SetDropTarget - это метод (в базовом классе) $ panel.

Из сообщения об ошибке мы можем предположить, что SetDropTarget () вызывается. Если пример runrig все еще применяется здесь (и я предполагаю, что это так), то даже несмотря на то, что SetDropTarget не сопровождается скобками, то есть у меня

$panel->SetDropTarget->

вместо

 $panel->SetDropTarget()->

Perl все еще вызывает SetDropTarget? (который проверяет количество и тип своих аргументов, а затем фатально жалуется во время выполнения). Это то, что происходит?

Ответы [ 3 ]

6 голосов
/ 22 октября 2011

Потому что это совершенно правильный синтаксис.$panel->SetDropTarget->( MyTextDropTarget->new($panel) ) означает «Вызвать метод &SetDropTarget из $panel, а затем разыменовать подреф, который возвращает &SetDropTarget».Я думаю, это не то, что вы хотели написать, но любая ошибка может быть вызвана во время выполнения, даже в строгом режиме.

6 голосов
/ 22 октября 2011

Ваш SetDropTarget, скорее всего, не возвращает ссылку на код, но вы не можете сказать это до времени выполнения:

#!/usr/bin/perl

my $panel = 'main';

$panel->SetDropTarget->("bloomin'");

sub SetDropTarget {
  return sub { print "Set the $_[0] drop target!\n" }
}
1 голос
/ 22 октября 2011

Perl проанализирован

$panel->SetDropTarget->( MyTextDropTarget->new($panel) );

означает "$panel - это объект; вызовите его метод SetDropTarget (необязательные скобки опущены), который будет возвращать ссылку на sub; вызов этого sub, передавая результат MyTextDropTarget->new($panel) в качестве единственного параметра. "

То есть Perl ожидал, что SetDropTarget будет что-то вроде foo в следующем коде:

sub foo {
    return sub {
        my $bar = shift;
        return $bar . ', world!'; 
    }
}

foo()->('Hello');
foo->('Goodby');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...