Size: a a a

2020 March 02

MG

Mikhail Guryev in KotlinLangRu
в чём поинт? вот в чём. почему эта функция возвращает 1?
fun foo(): Int? {
   var bar: Int? = 1
   return bar.also {
       bar = null
   }
}
источник

QH

Quantum Harmonizer in KotlinLangRu
Mikhail Guryev
в чём поинт? вот в чём. почему эта функция возвращает 1?
fun foo(): Int? {
   var bar: Int? = 1
   return bar.also {
       bar = null
   }
}
потому что bar равен 1 на момент, когда он передаётся в also
источник

MG

Mikhail Guryev in KotlinLangRu
Quantum Harmonizer
потому что bar равен 1 на момент, когда он передаётся в also
да, но лямбда в also выполняется ДО того, как функция foo завершится и вернёт значение. Выходит, что перед выполнением also создаётся копия объекта bar
источник

MG

Mikhail Guryev in KotlinLangRu
просто прекрасно, обожаю котлин ❤️
источник

Z

Zaner in KotlinLangRu
Mikhail Guryev
да, но лямбда в also выполняется ДО того, как функция foo завершится и вернёт значение. Выходит, что перед выполнением also создаётся копия объекта bar
У Int value-семантика(как и у примитивных типов в Java), по-этому тут действительно происходит копирование, с обычными типами копирования не происходит:                                                                                                                                                              data class A(var i:Int)
val a = A(2)
println(a)
println(a.also{it.i =4})
println(a)
var b = 3
println(b)
println(b.also { b = 4 })
println(b)
                                                                                                                                                                                                                                            Вывод будет:                                                                                                                                                                                                              A(i=2)
A(i=4)
A(i=4)
3
3
4                                                                                                                                                                                                                                            А вообще в IDE можно нажать Ctrl+B, и посмотреть реализацию ф-ции в 2 строки
источник

MG

Mikhail Guryev in KotlinLangRu
Zaner
У Int value-семантика(как и у примитивных типов в Java), по-этому тут действительно происходит копирование, с обычными типами копирования не происходит:                                                                                                                                                              data class A(var i:Int)
val a = A(2)
println(a)
println(a.also{it.i =4})
println(a)
var b = 3
println(b)
println(b.also { b = 4 })
println(b)
                                                                                                                                                                                                                                            Вывод будет:                                                                                                                                                                                                              A(i=2)
A(i=4)
A(i=4)
3
3
4                                                                                                                                                                                                                                            А вообще в IDE можно нажать Ctrl+B, и посмотреть реализацию ф-ции в 2 строки
копирование происходит всегда, какой бы тип ни был.
ты в своём примере немного подменил понятия :)
у тебя b,  внешняя переменная, а  it - внутренняя переменная лямбды
источник

Z

Zaner in KotlinLangRu
Mikhail Guryev
копирование происходит всегда, какой бы тип ни был.
ты в своём примере немного подменил понятия :)
у тебя b,  внешняя переменная, а  it - внутренняя переменная лямбды
если поменять it на a, результат будет тот же, вот весь код функции:                                                                                               public inline fun <T> T.also(block: (T) -> Unit): T {
   contract {
       callsInPlace(block, InvocationKind.EXACTLY_ONCE)
   }
   block(this)
   return this
}
тут нет копирования
источник

MG

Mikhail Guryev in KotlinLangRu
Zaner
если поменять it на a, результат будет тот же, вот весь код функции:                                                                                               public inline fun <T> T.also(block: (T) -> Unit): T {
   contract {
       callsInPlace(block, InvocationKind.EXACTLY_ONCE)
   }
   block(this)
   return this
}
тут нет копирования
я видел этот код. поэтому мой изначальный вопрос был: "как extensions в котлине переводятся в JVM?"
источник

ch

central hardware in KotlinLangRu
Mikhail Guryev
я видел этот код. поэтому мой изначальный вопрос был: "как extensions в котлине переводятся в JVM?"
котлине же компилируется сразу в байткод, он же не транспилятор, а еще можно декампилировать и посмотреть как котлиновские конструкции будут выглядеть в java
источник

MG

Mikhail Guryev in KotlinLangRu
Zaner
если поменять it на a, результат будет тот же, вот весь код функции:                                                                                               public inline fun <T> T.also(block: (T) -> Unit): T {
   contract {
       callsInPlace(block, InvocationKind.EXACTLY_ONCE)
   }
   block(this)
   return this
}
тут нет копирования
it на a поменять невозможно, так как it - иммьютабл, что ещё раз доказывает ,что копирование, всё-таки, происходит
источник

Z

Zaner in KotlinLangRu
Mikhail Guryev
it на a поменять невозможно, так как it - иммьютабл, что ещё раз доказывает ,что копирование, всё-таки, происходит
data class A(var i:Int)
val a = A(2)
println(a)
println(a.also{a.i =4})
println(a)
я это имел ввиду
источник

MG

Mikhail Guryev in KotlinLangRu
Zaner
data class A(var i:Int)
val a = A(2)
println(a)
println(a.also{a.i =4})
println(a)
я это имел ввиду
ой, да, сорри. но it = A(4) тебе нельзя будет сделать
источник

Z

Zaner in KotlinLangRu
Mikhail Guryev
it на a поменять невозможно, так как it - иммьютабл, что ещё раз доказывает ,что копирование, всё-таки, происходит
параметры функций всегда иммьютабл, это же не значит что происходит копирование
источник

Z

Zaner in KotlinLangRu
Mikhail Guryev
ой, да, сорри. но it = A(4) тебе нельзя будет сделать
если ты где-то в лямбде явно создашь A(4), то естественно будет выделение памяти под новый объект
источник

MG

Mikhail Guryev in KotlinLangRu
    var a: A? = A(2)
   println(a.also{a = null})
источник

MG

Mikhail Guryev in KotlinLangRu
ну-ка
источник

MG

Mikhail Guryev in KotlinLangRu
не глядя, что будет?
источник

MG

Mikhail Guryev in KotlinLangRu
Zaner
параметры функций всегда иммьютабл, это же не значит что происходит копирование
согласен
источник

Z

Zaner in KotlinLangRu
Mikhail Guryev
не глядя, что будет?
напечатает A(2) потому-что указатель именно на этот объект был захвачен вызовом also
источник

MG

Mikhail Guryev in KotlinLangRu
как ещё объяснить, если не копией?
источник