Ответ
with — это функция-расширение Kotlin, которая позволяет выполнить блок кода в контексте переданного объекта. Внутри блока this ссылается на объект, а результат — последнее выражение в блоке.
Пример:
val text = with(StringBuilder()) {
append("Hello")
append(", ")
append("world!")
toString() // результат
}
// text = "Hello, world!"
Особенности:
- Не изменяет исходный объект (в отличие от
apply). - Возвращает результат блока, а не объект.
- Упрощает работу с объектами, требующими множественных операций.
Ответ 18+ 🔞
А, ну это же классика, ёпта! with — это как будто ты заходишь в гости к объекту и начинаешь там хозяйничать, но не навсегда, а только пока чай не допьешь.
Представь, что у тебя есть StringBuilder — этакая мартышлюшка, которая умеет склеивать текст. Без with ты бы писал так:
val builder = StringBuilder()
builder.append("Hello")
builder.append(", ")
builder.append("world!")
val text = builder.toString()
Скучно же, блядь! Один и тот же builder повторяется, как заезженная пластинка. Терпения ноль ебать.
А вот с with — красота, ядрёна вошь!
val text = with(StringBuilder()) {
append("Hello") // Смотри-ка, а `this` — это уже наш StringBuilder!
append(", ")
append("world!")
toString() // Вот это вот последнее выражение — оно и будет результатом всей этой движухи.
}
// text = "Hello, world!"
Что тут происходит, по пунктам:
- Заходим в контекст:
with(StringBuilder())— ты создаёшь новогоStringBuilderи говоришь: "Чувак, я сейчас буду внутри тебя работать". this— это он: Внутри фигурных скобокthisволшебным образом превращается в этот самый свежесозданныйStringBuilder. Поэтому можно просто писатьappend(...), а неbuilder.append(...). Удобно, бля!- Делаем что надо: Внутри блока ты делаешь с объектом всё, что душе угодно — вызываешь методы, меняешь свойства.
- Возвращаем НЕ объект, а ЧТО ХОТИМ: Вот тут главный фокус, чтобы не обосраться. Функция
withвозвращает не сам объект, а результат последней строчки в блоке.- В примере выше последняя строчка —
toString(). Вот эта строка и станет значением переменнойtext. - Если бы последней строчкой было
append("!"), тоwithвернула бы не строку, а самStringBuilder(потому чтоappendвозвращаетthis). Это частая ошибка у новичков — они забывают последнюю строчку и потом охуевают, почему вtextлежит не строка, а какой-то объект.
- В примере выше последняя строчка —
Чем не является with:
- Это не
apply.applyвсегда возвращает сам объект (this). Аwith— что скажешь в последней строчке, то и вернёт.apply— это "настроить и отдать".with— это "поработать с ним и выдать какой-то итог". - Он не меняет объект магически. Если объект неизменяемый (immutable), то
withего не изменит. Он просто даёт к нему удобный доступ.
Итог: Используй with, когда тебе нужно взять объект, сделать с ним кучу операций и получить КАКОЙ-ТО РЕЗУЛЬТАТ ЭТИХ ОПЕРАЦИЙ. Не сам объект, а именно результат. Например, преобразовать, вычислить что-то на его основе. Если тебе нужен просто настроенный объект — тебе в apply или also.
Понял? А то смотри, не перепутай, а то будет тебе не "Hello, world!", а хуй с горы.