Как получить доступ к функциям верхнего уровня, ссылаясь на файл, в котором они объявлены? - PullRequest
0 голосов
/ 16 марта 2019

Если у вас есть файл MyUtils.kt в app / utils /:

package app.utils

fun log(message: String) {
    println(message)
}

И вы хотите получить доступ к этой функции log() из другого файла App.kt в приложении /, вы сделаете это:

package app

import app.utils.log

fun main() {
   log("hey")
}

Но мне не нравится, как функция log() импортируется из пакета / utils, а не из файла MyUtils.kt явно.Один из вариантов - объявить MyUtils.kt с помощью package app.utils.MyUtils, но я не думаю, что это хорошая практика - объявлять файлы в пакетах, у которых нет соответствующей папки.

Есть ли способ обойти это?

Редактировать: объявление object или class также не будет хорошим решением из-за проблем с памятью.

1 Ответ

1 голос
/ 18 марта 2019

TL; DR

Вы не можете.

Длинный ответ

Похоже, у вас неправильное представление о том, чтокласс или объект каким-то образом добавляет некоторые проблемы с памятью в ваше приложение.

Это не так.

На самом деле, если вы работаете на JVM, ваш журналФункция будет компилироваться следующим образом:

public final class UtilsKt {
    public static final void log(@NotNull String message) {
        Intrinsics.checkParameterIsNotNull(message, "message");
        System.out.println(message);
    }
}

Вы можете нажать Meta+Shift+A на IntelliJ, а затем сделать Show Kotlin bytecode, если вы мне не верите.

Кроме того, вы, кажется, веритедолжна быть возможность явно ссылаться на имя файла в импорте Kotlin.Нет способа сделать это.Файлы почти не имеют отношения к скомпилированному коду Kotlin (это своего рода случайность, когда имя файла фактически отражается в сгенерированном имени класса Java, как показано выше).

Пакеты в Kotlin обычно располагаются так, чтобы соответствоватькаталоги, в которых они находятся ... но это не обязательно, кстати.Вы можете написать классы в нескольких пакетах в одном каталоге.Это означает, что имена файлов и даже имена каталогов на самом деле не влияют на типы и импорт среды выполнения Kotlin.

Если вы беспокоитесь о невозможности быстро узнать, где объявлены ваши функции, я предлагаю вам использовать Javaсоглашение о вызове файлов по имени класса, который в нем живет, а затем оборачивает все функции в object (с этим абсолютно не связаны затраты времени выполнения).

package app.utils

object MyUtils {
    fun log(message:String) => println(message)
}

File: app / utils / MyUtils.kt

Но обратите внимание, что в любой приличной среде IDE переход к объявлению функции тривиален (обычно Meta + B в IntelliJ) независимо от того, в каком файле он находитсяв, поэтому эта проблема обычно не возникает при работе с IDE.

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