Что происходит в этой моей декларации? - PullRequest
5 голосов
/ 05 декабря 2009

Я знаю, что название звучит забавно, но я где-то нашел этот фрагмент:

my MyPackage $p1 = MyPackage->new;

Какую роль играет имя пакета перед $p1?

РЕДАКТИРОВАТЬ: я использую Perl 5.10.1.

Ответы [ 3 ]

11 голосов
/ 05 декабря 2009

Проверяет пакет с тем же именем и на данный момент привязан к прагме fields, которая помогает проверять опечатки в именах полей.

Например:

package MyPackage;
use fields qw/ foo bar /;
sub new { fields::new(shift) }

Тогда, если вы попытаетесь запустить

use MyPackage;
my MyPackage $p1 = MyPackage->new;
print $p1->{notpresent}, "\n";

вы получите

No such class field "notpresent" in variable $p1 of type MyPackage at ...
6 голосов
/ 05 декабря 2009

С http://perldoc.perl.org/functions/my.html:

мой тип EXPR: ATTRS

A my объявляет перечисленные переменные как локальные (лексически) для включающего блока, файла или eval. Если указано более одного значения, список должен быть заключен в скобки.

Точная семантика и интерфейс TYPE и ATTRS все еще развиваются. В настоящее время TYPE привязан к использованию полей pragma, а атрибуты обрабатываются с использованием атрибутов pragma или начиная с Perl 5.8.0 также через модуль Attribute :: Handlers.

0 голосов
/ 06 декабря 2009

В дополнение к использованию в полях лексический тип используется экспериментальными типами прагмы (доступно из CPAN).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...