Какой синтаксис используется для sub foo: method {shift-> bar (@_)}? - PullRequest
7 голосов
/ 24 августа 2011
sub foo : method { shift->bar(@_) }

Что означает : method здесь?

Я никогда не использовал это таким образом ...

1 Ответ

11 голосов
/ 24 августа 2011

: method - это атрибут функции описание. Подпрограмма, помеченная таким образом, не вызовет предупреждение «Неоднозначный вызов разрешен как CORE ::% s».

Из комментария ysth :

Предупреждение появляется, когда подпрограмма имеет то же имя, что и встроенная функция, и она вызывается без &, а не как вызов метода; Perl использует встроенный вместо этого, но выдает предупреждение. Метод: успокаивает предупреждение, потому что он ясно указывает, что подпрограмма никогда не предназначалась для вызова в качестве не-метода в любом случае.

Обновление

Этот код просто вызывает метод bar, когда вызывается foo:

sub foo : method {  ## Mark function as method
    shift->bar(@_)  ## Pass all parameters to bar method of same object
}

Подробнее:

  • : method - Указывает, что указанная подпрограмма является методом. Подпрограмма, помеченная таким образом, не вызовет предупреждение «Неоднозначный вызов разрешен как CORE ::% s».
  • shift - получает первый параметр из @_, который будет $self
  • ->bar(@_) - вызвать метод того же класса bar со всеми другими параметрами

Вы можете прочитать это как:

sub foo : method {
    my ($self) = shift @_; 
    return $self->bar(@_);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...