Делегаты. Наблюдаемые для анонимных функций в kotlin? - PullRequest
0 голосов
/ 12 июня 2019

Я делаю что-то странное, но у меня мимолетное чувство, что это возможно.

Возможно ли следующее с Kotlin? (Компилируется, но не работает)

 var delegatedProp: (Int) -> Unit by Delegates.observable({ a-> Unit }) { _, _, newVal ->
        //This is never raised
        //Secondly how should I access the given Int ?
        //newVal.a doesn't seem to compile
    }

У меня не было идеи, что, как только я вызову DelegatedProp (10), наблюдаемая будет вызываться, и я смогу получить доступ к newVal.a.

Это успешно компилируется, но наблюдаемое никогда не вызывается

1 Ответ

2 голосов
/ 12 июня 2019

Вторая лямбда будет вызываться , когда вы установите delegatedProp, т.е.

x.delegatedProp = { print(it) }

({ print(it) } - просто пример чего-то типа (Int) -> Unit). И newVal будет функцией, для которой вы устанавливаете свойство, в данном случае { print(it) }. Так что у него нет .a.

Если вы хотите что-то сделать при вызове delegatedProp(10), вы просто ... помещаете эти действия в функцию:

val delegatedProp: (Int) -> Unit = { a -> /* do whatever you wanted to do with newVal.a */ }

Если вы хотите, чтобы delegatedProp был var, но чтобы продолжать выполнять «дополнительные» действия независимо от того, на что он назначен, самый простой способ - это пользовательский метод получения:

var delegatedProp: (Int) -> Unit = { a -> Unit }
    get() = { a ->
        /* whatever you want to do with a */
        field(a)
    }

Или сеттер: он не будет создавать новую лямбду каждый раз, когда к ней обращаются, но либо дублирует немного кода, либо должен быть явно установлен хотя бы один раз, а не только инициализирован.

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