как использовать лямбду в качестве обратного вызова в kotlin - PullRequest
0 голосов
/ 08 июля 2019

Допустим, у меня есть класс вроде:

class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambda1: (Boolean)->Unit){
    this.var1 = var1 
    this.str1 = str1 
    // do something
    }
}

Как вызвать метод test и передать логический для запуска лямбда-тела?

var t1 = Testing()
t1.test(1, "String"){
      // do something else
}

Ответы [ 2 ]

1 голос
/ 08 июля 2019
class Testing() {
  var var1 = 0
  var str1 = ""
  var b = false

  fun test(var1: Int, str1: String, lambda1: (Boolean)->Unit){
    this.var1 = var1 
    this.str1 = str1 
    // do something
    lambda1(false) // or lambda1.invoke(true) // here your boolean value is passed to your lambda1-function
  }
}

Где-то еще:

test(1, "one") {
  // this is now your lambda1-function-body accepting a boolean...
  // here you now have three(+) ways to implement it...
}

Варианты lambda1-body:

  1. игнорирование заданного логического значения:

    test(1, "one") { // _ -> // <- you can write this out explicitly if you like
      println("boolean value is ignored here")
    }
    
  2. с использованием it или именованного параметра (в данном случае passedBool):

    test(1, "one") { passedBool ->
      println("boolean value $passedBool was passed")
    }
    
  3. ссылка на метод:

    fun anythingThatConsumesABoolean(bool : Boolean) { }
    
    test(1, "one", ::anythingThatConsumesABoolean)
    

Итак, как вы можете видеть: вы не передаете логическое значение извне, а скорее имеете дело с ним в функции обратного вызова.

1 голос
/ 08 июля 2019

Вам нужно назвать свой лямбда-параметр или, если он не будет использоваться, назвать его как _.

Примерно так:

fun example1() {
    var t1 = Testing()
    t1.test(1, "String") { bool ->
        // Do stuff
    }
}

fun example2() {
    var t1 = Testing()
    t1.test(1, "String", { bool -> 
        // Do stuff
    })
}

Я полагаю, вы хотитевызовите ваш обратный вызов в методе test в классе Testing.В этом случае вам нужно предоставить аргумент функции, чтобы вызвать лямбду с аргументом arg.может сделать это так:

class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambdaArg: Boolean, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        // Invoke the callback
        lambda1(lambdaArg)
    }
}

Или, если аргумент, передаваемый в лямбду, является функцией того, что происходит в вашей функции test, тогда вы можете опустить предоставление лямбда-аргумента test а вместо этого жесткий код ваш аргумент в вызове лямбды следующим образом:

class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        if (this.var1 == 0) {
            lambda1(false)
        } else { 
            lambda1(true)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...