Use also when a block should observe a value and keep that value.

also `also` passes the value as `it`, runs the block, and returns the original value.

Also Side Value

number
AlsoSideValue.kt
Replay: real traced execution (multi-file project)
fun main() {
    val number = 4
    var note = "waiting"
    val before = note
    val doubled = (number * 2).also { value ->
        note = "saw:$value"
    }

    println("number=$number")
    println("before=$before")
    println("doubled=$doubled")
    println("note=$note")
}
fun main() {
    val number = 2
    var note = "waiting"
    val before = note
    val doubled = (number * 2).also { value ->
        note = "saw:$value"
    }

    println("number=$number")
    println("before=$before")
    println("doubled=$doubled")
    println("note=$note")
}
fun main() {
    val number = 6
    var note = "waiting"
    val before = note
    val doubled = (number * 2).also { value ->
        note = "saw:$value"
    }

    println("number=$number")
    println("before=$before")
    println("doubled=$doubled")
    println("note=$note")
}
  1. number ← 4, note ← waiting, before ← waiting, doubled ← 8

    1fun main() {2    val number→ 4 = 4 //@number=2, 63    var note→ waiting = "waiting"4    val before→ waiting = notewaiting5    val doubled→ 8 = (number4 * 2).also { value ->6        note = "saw:$value"7    }89    println("number=$number4")10    println("before=$beforewaiting")11    println("doubled=$doubled8")12    println("note=$notesaw:8")13}
    outputnumber=4
    before=waiting
    doubled=8
    note=saw:8
  1. number ← 2, note ← waiting, before ← waiting, doubled ← 4

    1fun main() {2    val number→ 2 = 23    var note→ waiting = "waiting"4    val before→ waiting = notewaiting5    val doubled→ 4 = (number2 * 2).also { value ->6        note = "saw:$value"7    }89    println("number=$number2")10    println("before=$beforewaiting")11    println("doubled=$doubled4")12    println("note=$notesaw:4")13}
    outputnumber=2
    before=waiting
    doubled=4
    note=saw:4
  1. number ← 6, note ← waiting, before ← waiting, doubled ← 12

    1fun main() {2    val number→ 6 = 63    var note→ waiting = "waiting"4    val before→ waiting = notewaiting5    val doubled→ 12 = (number6 * 2).also { value ->6        note = "saw:$value"7    }89    println("number=$number6")10    println("before=$beforewaiting")11    println("doubled=$doubled12")12    println("note=$notesaw:12")13}
    outputnumber=6
    before=waiting
    doubled=12
    note=saw:12

Follow the Value

  1. number starts at 4.
  2. note starts as waiting, so before also becomes waiting.
  3. number * 2 makes 8.
  4. also sees that 8 and changes note to saw:8.
  5. also still returns the original 8, so doubled is 8. | number | before | doubled | final note | | ---: | --- | ---: | --- | | 2 | waiting | 4 | saw:4 | | 4 | waiting | 8 | saw:8 | | 6 | waiting | 12 | saw:12 |

Exercise: AlsoSideValue.kt

Reproduce number=4, before=waiting, doubled=8, and note=saw:8, then use numbers 2 and 6 to predict doubled and note.