Чтобы проверить встраивание при использовании 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
)