Включение модуля из другого модуля [дубликат]

Я решил, что я опубликую обновленный ответ для тех, кто смотрит на что-то немного более актуальное.

В настоящее время Android и Android Studio поддерживают подмножество функций Java 8. Согласно документации на Android, расположенной на их веб-сайте , Google говорит:

Для поддержки функций языка Java 8 требуется новый компилятор Jack. Джек поддерживается только на Android Studio 2.1 и выше. Поэтому, если вы хотите использовать возможности Java 8, вам нужно использовать Android Studio 2.1 для сборки вашего приложения.

Если у вас уже установлена ​​Android Studio, убедитесь, что вы обновили ее до последней версии, нажав «Справка»> Проверьте наличие обновлений (на Mac, Android Studio> Проверить наличие обновлений). Если у вас еще нет IDE, установленной на вашей рабочей станции, загрузите Android Studio здесь.

Поддерживаемые Java 8 языковые функции и API

Android не поддерживает все функции языка Java 8. Однако при разработке приложений, ориентированных на Android 7.0 (API level 24), доступны следующие функции:

  • Методы по умолчанию и статические интерфейсы Лямбда-выражения (также доступны на уровне API 23 и ниже)
  • Повторяющиеся аннотации
  • Ссылки на методы (также доступны на уровне API 23 и ниже)
  • Тип Аннотации (также доступны на уровне API 23 и ниже)

Кроме того, доступны следующие API-интерфейсы Java 8:

Reflection и связанные с языком API:

  • java.lang .FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.Method.isDefault () и API-интерфейсы Reflection, связанные с повторяемыми аннотациями, такими как AnnotatedElement.getAnnotationsByType (Class)

Утилиты API:

  • java.util.function
  • java.util.stream

Чтобы использовать новые функции языка Java 8, вам также необходимо использовать Jack L-цепи . Эта новая инструментальная привязка для Android компилирует исходные языки Java в Android-readable байт-код DEX, имеет свой собственный формат библиотеки .jack и предоставляет большинство функций toolchain как часть одного инструмента: переупаковка, сжатие, обфускация и multidex.

Ниже приведено сравнение двух наборов инструментов, используемых для создания файлов Android DEX:

Legacy javac toolchain:
    javac (.java → .class) → dx (.class → .dex)
    New Jack toolchain:
    Jack (.java → .jack → .dex)

10
задан hobbs 23 September 2009 в 02:50
поделиться

3 ответа

Perl хранит, где модули загружаются из хэш% INC. Вы можете загружать вещи относительно этого:

package Module::Foo;
use File::Spec;
use strict;
use warnings;

my ($volume, $directory) = File::Spec->splitpath( $INC{'Module/Foo.pm'} );
my $config_file = File::Spec->catpath( $volume, $directory, '../configure.yaml' );

% Ключи INC основаны на строгом переводе :: to / with .pm, добавленном даже в Windows, VMS и т. Д.

Обратите внимание, что значения в% INC могут относиться к текущему каталогу, если вы поместите относительные каталоги в @INC, поэтому будьте осторожны, если вы меняете каталоги между требованием / использованием и проверкой% INC.

14
ответ дан ysth 24 August 2018 в 23:52
поделиться

Для решения этой проблемы существует модуль с именем File :: ShareDir . Вы были на правильном пути, пытаясь найти FindBin, но FindBin всегда находит запущенную программу , а не модуль, который ее использует. ShareDir делает что-то очень похожее на решение ysth, за исключением завершенного в приятном интерфейсе.

Использование так же просто, как

my $filename = File::ShareDir::module_file(__PACKAGE__,
  'my/data.txt');
# and then open $filename or whatever else.

или

my $dirname = File::ShareDir::module_dir(__PACKAGE__);
# Play ball!
9
ответ дан hobbs 24 August 2018 в 23:52
поделиться

Измените свой use Module вызов на require Module (или require Module; Module->import(LIST)). Затем используйте отладчик, чтобы пройти процесс загрузки модуля и посмотреть, откуда Perl думает, что он загружает файлы.

8
ответ дан mob 24 August 2018 в 23:52
поделиться
  • 1
    ну, я не думаю, что в моей программе есть BUG - я просто не знаю, как написать это :), если я просто напишу, например, LoadFile (& quot; ../ configure.yaml & quot;); в модуль, и я использую модуль THAT в скрипте, который находится где-то в другом месте, Perl просто использует его как относительный путь из файла сценария, а не файла модуля. Требовать или отлаживать не помогает, я ЗНАЮ, где проблема, я просто не знаю, что с ней делать – Karel Bílek 23 September 2009 в 02:28
  • 2
    Да, это .. спасибо :) – Karel Bílek 23 September 2009 в 02:44
Другие вопросы по тегам:

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