Вторая лямбда будет вызываться , когда вы установите 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)
}
Или сеттер: он не будет создавать новую лямбду каждый раз, когда к ней обращаются, но либо дублирует немного кода, либо должен быть явно установлен хотя бы один раз, а не только инициализирован.