Лямбда-выражение внутри строки Kotlin - PullRequest
0 голосов
/ 26 января 2019

Мой код:

class Team (val name: String, val aggressive: Boolean = true) {

    val attendance: Int

    init {
        if (aggressive){
            attendance = 25000
        } else {
            attendance = 20000
        }
    }

}

...

fun chooseTeam() {
    val homeTeam = Team(name = "Everton")
    println("the home team is $homeTeam.aggressive so they are ${if ($homeTeam == "aggressive") "angry" else "timid" }") 
}

Я пытаюсь присвоить значение лямбда-строки, основываясь на том, истинно ли $homeTeam.aggressive или нет.

Тем не менее, я получаю красные линии по всей лямбде, поэтому, очевидно, синтаксис отключен.Может кто-нибудь сказать мне, что не так с кодом?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

То, что вы на самом деле имеете в виду, это шаблон строки , а не лямбда. Вы, должно быть, перепутали это, потому что оба используют фигурные скобки {...}.

Вы можете сделать это так:

fun chooseTeam() {
    val homeTeam = Team(name = "Everton")

    // 1) no dollar sign before homeTeam in the comparison
    // 2) you need to compare to homeTeam.aggressive and not homeTeam
    println("the home team is ${homeTeam.name} so they are ${if (homeTeam.aggressive) "angry" else "timid" }")
}

Или, лучше, вы сначала назначаете отображение (Boolean на String) переменной, что повышает удобочитаемость.

fun chooseTeam() {
    val homeTeam = Team(name = "Everton")
    val adjective = if (homeTeam.aggressive) "angry" else "timid"

    println("the home team is ${homeTeam.name} so they are $adjective")
}
0 голосов
/ 26 января 2019

Правильный путь

fun chooseTeam() {
    val homeTeam = Team(name = "Everton")

    // 1) no dollar sign before homeTeam in the comparison 
    // 2) in kotlin if you declare constructor parameter as val they also becomes property of class which you can access like this homeTeam.aggressive
    // 2) if you want the name of team, just use ${homeTeam.name} instead $homeTeam.aggression
    println("the home team is $homeTeam.aggression so they are ${if(homeTeam.aggressive) "angry" else "timid"}") 
}

Надеюсь, это поможет.

Редактировать: Более подробное объяснение дает @Willi Mentzel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...