thomasnield / RxKotlinFX

Kotlin extensions to the RxJavaFX framework
Apache License 2.0
175 stars 13 forks source link

Why is the value of the val in the closure seemingly being mutated? #23

Open andysy opened 4 years ago

andysy commented 4 years ago

For the code below, why does xnow change along with x? e.g. I was expecting to see the "Observer N received click" to retain the N value that was assigned to xnow when the closure was initially created...

Observer 2 subscribing!
Observer 1 received click
Observer 2 received click
Observer 3 subscribing!
Observer 1 received click
Observer 3 received click
Observer 3 received click
Observer 4 subscribing!
Observer 1 received click
Observer 4 received click
Observer 4 received click
Observer 4 received click
import tornadofx.*
import io.reactivex.rxkotlin.*
import io.reactivex.Observable
import javafx.scene.control.*

class MyApp: App(MyView::class)

class MyView: View() {
  override val root = vbox {
    var clicks = button("Pressme").actionEvents()
    var x = 1
    clicks.subscribe { println("Observer 1 received click") }

    button("Subscribe New Observer") {
      setOnAction {
        x++
        println("Observer $x subscribing!")
        clicks.subscribe { val xnow=x; println("Observer $xnow received click")}
      }
    }
  }
}