Что такое with в Kotlin
Что проверяют
Владеете ли вы scope-функциями осознанно. Их пять, и различаются они двумя признаками: как передан объект (получателем или аргументом) и что возвращается из вызова. Вопрос про with это проверка, помните ли вы обе колонки этой таблицы, а не только красивый синтаксис.
Как отвечать
with это обычная функция стандартной библиотеки, не расширение. Берёт объект и лямбду, делает объект получателем внутри блока (доступен как this и неявно) и возвращает результат последнего выражения лямбды. Она inline, поэтому лишних объектов и вызовов в рантайме не появляется.
val text = with(user) {
name = name.trim()
"$name, $age"
}Соседи по семейству: apply тоже даёт получателя, но возвращает сам объект; run совпадает с with по возвращаемому значению, но вызывается на объекте и потому дружит с безопасным вызовом; let и also передают объект аргументом it.
В Android with чаще всего встречается на биндинге во фрагменте или на вьюхе элемента в адаптере списка, где иначе имя объекта повторяется в каждой строке блока.
Где спотыкаются
Берут with для значения, которое может быть null. Безопасного вызова у неё нет, объект передаётся аргументом, и проверку придётся писать внутри блока руками; для такого случая есть user?.run { }.
Ждут, что вернётся сам объект. Возвращается результат лямбды, и присваивание вида val v = with(view) { setup() } даст Unit, после чего ошибка вылезет на типе где-то дальше по коду.
Вкладывают scope-функции друг в друга. Неявные получатели перекрываются, свойство с совпадающим именем незаметно берётся не у того объекта; помогает явный получатель через this с меткой или переход на let с осмысленным именем вместо it.