Наследование AFAIK в Perl обычно настраивается как это:
package Mule;
our @ISA = ("Horse", "Donkey");
Есть ли любые примеры где use base
(или use parent
) лучше вместо этого?
Установление наследования во время компиляции позволяет избежать особенно трудно отлаживаемого цикла зависимости, который показан ниже.
# Child.pm
package Child;
our @ISA = qw(Mother);
use Foo;
# Mother.pm
package Mother;
sub wibble { 42 }
# Foo.pm
package Foo;
use Child;
Child->wibble;
Если вы "используете Child" перед "используете Foo", то Foo попытается вызвать Child->wibble
до того, как будет установлено наследование от Mother
. Если вместо этого Child будет использовать parent qw(Mother)
, то его наследование будет установлено до того, как он попытается загрузить что-либо еще.
Я сталкивался с подобной петлей зависимости в частном, корпоративном коде, который имеет тенденцию быть немного более переплетенным, чем публичный код. Это отстой для отладки, поэтому я рекомендую всегда устанавливать наследование во время компиляции.
use base qw(Horse Donkey);
Это примерно эквивалентно:
BEGIN {
require Horse;
require Donkey;
push @ISA, qw(Horse Donkey);
}
Это более аккуратно, если вам нужно загружать код модулей, а также наследоваться от них. BTW, есть проблемы с множественным наследованием, но это уже другой вопрос :)
Edit: Преимущества компиляции против выполнения:
Если вы хотите решить, использовать ли данный модуль во время выполнения, то вы можете проверить и добавить модуль к родителям:
if (eval { require X }) { push @ISA, 'X'; }
Как показано в этом потоке , возможно, потребуется завершить существующий процесс abd
или разблокировать 5037 порт (остатки предыдущих попыток запуска adb
).
-121--2292316-Попробуйте закрыть Eclipse, выдав «
C :\Users\Mohit\Documents\StartSDK\tools kill-server
» - команда терминала и повторение.
Если это все еще не работает, можно попробовать открыть монитор активности, чтобы проверить, запущены ли какие-либо процессы adb, и убить их.Привет, сейчас все в порядке, я видел с
nestat - командной строкой
, что это был несколько процессов на порту 5037. Порт, служащий для эмулятора.
Спасибо
Хорошо, нашли. Это был курсор (называемый Выделением в Edit Text и TextViews).
Вот как я получил его для работы:
ivClear // assigned the EditText that has the input
ivCrypt // assigned the target EditText, that I want to scroll
aText // the input from ivClear, crypted
Тогда используйте:
ivCrypt.setText(aText); // assign the Text
ivCrypt.setSelection(ivClear.getSelectionStart()); // scroll
Phew, наконец:) Всегда недооценивал мощность Spannable;)
-121--4817565-Относительно compile-vs-run-time:
В Perl модули (пакеты/пространства имен) обычно находятся в отдельных файлах. Т.е. Некоторые:: Модуль
можно найти в Some/Module.pm. В этой настройке разница между временем компиляции и временем выполнения не будет иметь большого значения. Время выполнения модуля, загружаемого с помощью use ()
, будет предшествовать времени компиляции вызывающего кода. Обозреватель:
Файл Некоторые/Module.pm
:
package Some::Module;
BEGIN{ print "Some::Module - compile time\n" }
print "Some::Module - run time\n";
1;
Файл test.pl
:
BEGIN{ print "Just started compiling the program.\n" }
use Some::Module;
BEGIN{ print "main - compile time\n" }
print "main - run time\n";
Выходные данные:
Just started compiling the program.
Some::Module - compile time
Some::Module - run time
main - compile time
main - run time
Поэтому перед компиляцией будет выполнен our @ ISA = qw (Base);
Однако правильно, что присвоение @ ISA
не гарантирует загрузку базового класса. Вот почему мы имеем базу использования
и использовать родительские
прагматики. Если нет необходимости в каких-либо функциях use base
(поля) или требуется более длительная обратная совместимость, обеспечиваемая use parent
, рекомендуется использовать более легкий use parent
.