Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpRfCl 144 of 299 menu
◀ ▶

Вызов по ссылке в Kotlin

Элемент из memberFunctions имеет тип KFunction. У него есть call - универсальный вызов: аргументы передают списком, как при обычном обращении к методу.

У функции без параметров, кроме скрытого получателя, достаточно передать экземпляр класса одним аргументом:

import kotlin.reflect.full.memberFunctions class Beacon(val channel: String) { fun ping(): String = "on:$channel" } fun main() { val pingFn = Beacon::class.memberFunctions .single { it.name == "ping" } val unit = Beacon("north") println(pingFn.call(unit)) }

Если у метода есть параметры, их добавляют после экземпляра в том же порядке, что в объявлении:

import kotlin.reflect.full.memberFunctions class Beacon(val channel: String) { fun format(level: Int): String = "$channel:$level" } fun main() { val formatFn = Beacon::class.memberFunctions .single { it.name == "format" } val unit = Beacon("east") println(formatFn.call(unit, 3)) }

Ссылку на функцию можно взять и через ИмяКласса::имяФункции - тогда поиск в списке не нужен. Функция call по-прежнему получает получателя первым аргументом:

class Beacon(val channel: String) { fun format(level: Int): String = "$channel:$level" } fun main() { val formatFn = Beacon::format println(formatFn.call(Beacon("west"), 1)) }

Класс Timer хранит строковую метку и содержит функцию, которая возвращает строку "tick-" с этой меткой в конце. Найдите функцию через рефлексию и вызовите её через call для готового экземпляра.

Сделайте класс Mixer с функцией из двух целых параметров, возвращающей их сумму. Вызовите метод по ссылке KFunction с аргументами 2 и 5 и выведите результат.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить