Я должен установить наследование во время компиляции, а не время выполнения, и раз так почему?

Наследование AFAIK в Perl обычно настраивается как это:

package Mule;
our @ISA = ("Horse", "Donkey");

Есть ли любые примеры где use base (или use parent) лучше вместо этого?

6
задан brian d foy 13 February 2010 в 19:21
поделиться

3 ответа

Установление наследования во время компиляции позволяет избежать особенно трудно отлаживаемого цикла зависимости, который показан ниже.

# 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), то его наследование будет установлено до того, как он попытается загрузить что-либо еще.

Я сталкивался с подобной петлей зависимости в частном, корпоративном коде, который имеет тенденцию быть немного более переплетенным, чем публичный код. Это отстой для отладки, поэтому я рекомендую всегда устанавливать наследование во время компиляции.

3
ответ дан 10 December 2019 в 02:47
поделиться
use base qw(Horse Donkey);

Это примерно эквивалентно:

BEGIN {
    require Horse;
    require Donkey;
    push @ISA, qw(Horse Donkey);
}

Это более аккуратно, если вам нужно загружать код модулей, а также наследоваться от них. BTW, есть проблемы с множественным наследованием, но это уже другой вопрос :)

Edit: Преимущества компиляции против выполнения:

  • У вас есть безопасность проверки во время компиляции с use base, что означает, что ваш скрипт даже не запустится, если ваш базовый модуль не присутствует в файловой системе.
  • Если вы хотите решить, использовать ли данный модуль во время выполнения, то вы можете проверить и добавить модуль к родителям:

    if (eval { require X }) { push @ISA, 'X'; }

5
ответ дан 10 December 2019 в 02:47
поделиться

Как показано в этом потоке , возможно, потребуется завершить существующий процесс abd или разблокировать 5037 порт (остатки предыдущих попыток запуска adb ).

Попробуйте закрыть Eclipse, выдав « C :\Users\Mohit\Documents\StartSDK\tools kill-server » - команда терминала и повторение.
Если это все еще не работает, можно попробовать открыть монитор активности, чтобы проверить, запущены ли какие-либо процессы adb, и убить их.

Привет, сейчас все в порядке, я видел с nestat - командной строкой , что это был несколько процессов на порту 5037. Порт, служащий для эмулятора.
Спасибо

-121--2292316-

Хорошо, нашли. Это был курсор (называемый Выделением в 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 .

1
ответ дан 10 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: