Итак, в эти дни я работаю с проектом, который использует Perl и Moose. Я понимаю, что Муз построен на СС. Я не слишком хорошо знаком с СС, и я столкнулся с чем-то, чего не понимаю, и я мог бы использовать теоретическое объяснение. Вот это модуль namespace::autoclean
«в документации:Объясните это колдовство !!! (в Perl, с Moose и namespace :: autoclean)
SYNOPSIS
package Foo;
use namespace::autoclean;
use Some::Package qw/imported_function/;
sub bar { imported_function('stuff') }
# later on:
Foo->bar; # works
Foo->imported_function; # will fail. imported_function got cleaned after compilation
Так, назад, прежде чем я когда-либо использовали лось, так, что вы называемый метод на объекте был: интерпретатор Perl будет выглядеть на этот метод в таблице символов пакет, на который был благословлен ваш объект (тогда, если не найден, рассмотрите наследование и т. п.). То, как оно называлось импортированной функцией внутри пакета, было: оно искало имя функции в таблице символов пакета. Насколько мне известно до настоящего времени, это означает одну и ту же таблицу символов, так что это поведение должно быть невозможно.
Мой первоначальный осмотр источника не был продуктивным. В широком смысле, что отличает при использовании Moose, MOP и namespace :: autoclean, что этот вид обмана становится возможным?
ed. Чтобы быть особенно понятно, если бы я был заменить use namespace::autoclean
с
CHECK { undef *Foo::imported_function }
то Foo->bar;
вызова описан в документации будет врезаться, потому что Foo->bar
не знает, где найти imported_function
.
Просто на длинном снимке: может быть, с помощью 'use subs qw/imported_функции /;' остановить автоочистку? Или импортировать * перед * загрузкой 'namespace :: autoclean'? – amon