все внутри использования {} должно быть выражением
Если вы посмотрите на подпись , вы увидите, что use
занимает (T) -> R
функция, так что любая функция / лямбда, которая принимает закрываемый объект в качестве параметра, может быть передана ему.
После того, как это заблуждение прояснится, давайте посмотрим, что делает рассматриваемый код.
streamIn.use { input ->
streamOut.use { output ->
input.copyTo(output)
}
}
Сначала мы видим streamIn.use {
, что означает, что мы собираемся сделать что-то с streamIn
, а затем закроем это. И с этого момента streamIn
будет называться input
. Затем есть streamOut.use {
, что означает, что мы также будем использовать streamOut
для выполнения каких-либо задач, а затем закроем его, и с этого момента мы будем называть его output
.
Я не понимаю, откуда взято "input"
Это в основном дает другое имя it
, как в вашем первом фрагменте кода. Так как здесь мы вложили лямбды, мы не можем использовать it
для ссылки на параметры обеих лямбд.
«вход» явно относится к тому же объекту, на который ссылается «streamIn», ноЯ не понимаю, как Котлин это знает.
Это потому, что в реализации use
, вероятно, есть такая строка:
return block(this)
block
isлямбда-параметр, который вы передаете use
, а this
- это объект, для которого вызывается use
. Поскольку input
является параметром лямбды, он относится к this
.
Теперь мы объявили, что будем использовать два ресурса, что с ними делать? input.copyTo(output)
! Все, что возвращает copyTo
, будет возвращено streamOut.use
, которое, в свою очередь, будет возвращено streamIn.use
. streamOut
и streamIn
также будут закрываться один за другим.
Итак, что мы сделали в целом? Мы в основном использовали 2 ресурса одновременно и закрыли их впоследствии. Вот как вы составите use
, чтобы использовать несколько ресурсов одновременно.