Оценить блок кода в Kotlin (чтобы скрыть переменные в области видимости) - PullRequest
3 голосов
/ 03 апреля 2019

В Scala вы можете написать

val x = {
  ... do some complex computations ..
  42
}

чтобы спрятать вещи внутри блока кода.

Ближе всего я приехал в Котлин:

val x = {
  ... do some complex computations ..
  42
}()

Есть ли лучший способ?

EDIT:

  • не является run {} в приведенном выше примере, по существу, то же самое
  • дорогой ли вызов?

ОТВЕТ:

  • с использованием run {} строк, тогда как {}() НЕ (см. Мой собственный ответ ниже)

Ответы [ 4 ]

5 голосов
/ 03 апреля 2019

Используйте функцию run. Он принимает функцию в качестве параметра, запускает ее и возвращает результат.

val x = run {
  ... do some complex computations ..
  42
}

Функция run встроена, поэтому производительность не будет снижаться.

2 голосов
/ 03 апреля 2019

Да, есть функция run .

val x = run {
    ...
    42
}
0 голосов
/ 04 апреля 2019

Чтобы проверить встраивание при использовании run, я создал небольшой пример:

    fun main() {
        {
            Math.random()
        }()

        run {
            Math.random()
        }
    }

и просмотрел полученный байт-код:

  public final static main()V
   L0
    LINENUMBER 2 L0
    GETSTATIC TestKt$main$1.INSTANCE : LTestKt$main$1;
    CHECKCAST kotlin/jvm/functions/Function0
    INVOKEINTERFACE kotlin/jvm/functions/Function0.invoke ()Ljava/lang/Object; (itf)
    POP
   L1
    LINENUMBER 6 L1
   L2
   L3
   L4
    ICONST_0
    ISTORE 0
   L5
    LINENUMBER 7 L5
    INVOKESTATIC java/lang/Math.random ()D
   L6
   L7
    LINENUMBER 6 L7
   L8
    POP2
   L9
    LINENUMBER 9 L9
    RETURN
   L10
    LOCALVARIABLE $i$a$-run-TestKt$main$2 I L5 L7 0
    MAXSTACK = 2
    MAXLOCALS = 1

Итак, действительно:

  • При вызове через () вызывается сгенерированный Function0 -произведенный класс, который инкапсулирует блок как лямбда (метка L0)
  • Вызов через run полностью вставляет блок (метка L5)
0 голосов
/ 03 апреля 2019

А также вы можете использовать эти методы тоже:

 val a=1.also{
    // your code
}
val b=2.apply{
    // your code}
}
val c=3.let{
    // your code
}
val d=4.runCatching{
    // your code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...