3、由函数提供默认参数

首先我们完善了上一期的函数:

fun shouldChangeWater(
    day:String,
    temperature:Int=22,
    dirty:Int=20):Boolean{

    return when{
        temperature>30->true
        dirty>30->true
        day=="Sunday"->true
        else->false

    }
}

在Kotlin中,完成一项任务可以有多种方法,比如:

fun shouldChangeWater(
    day:String,
    temperature:Int=22,
    dirty:Int=20):Boolean{

    var isTooHot = temperature>30
    var isDirty = dirty>30
    var isSunday = day == "Sunday"

    return when{
        isTooHot->true
        isDirty->true
        isSunday->true
        else->false
    }
}

我们还可以使用只有一行的函数:

fun isTooHot(temperature: Int)=temperature>30
fun isDirty(dirty: Int)=dirty>30
fun isSunday(day: String)=day == "Sunday"

之后我们在when语句中调用:

return when{
            isTooHot(temperature)->true
            isDirty(dirty)->true
            isSunday(day)->true
            else->false
        }

我们还可以使用函数来提供默认参数,比如:

fun getDirtySensorReading()=20

fun shouldChangeWater(
            day:String,
            temperature:Int=22,
            dirty:Int=getDirtySensorReading):Boolean

注意,这代表你可以在提供默认参数函数中进行一些耗时的操作,比如读文件或者分配内存,但是这会影响到一些你的程序性能,因为默认参数是在函数被调用的时候进行计算的,同样,当你多次调用了提供默认参数的函数,也许会导致程序崩溃(因为占用内存变多了)

接下来是一个repeat关键字(类似于循环):

repeat(2){
        println("A fish is swimming")
    }

此处又重复了一遍:
Kotlin中的任何东西都是一个有值的表达式,但是有几个例外,比如for循环和while循环

下面又到了每期的练习环节:
Improve your whatShouldIDoToday() program with the new knowledge from this segment.
Add 3 more situations and activities. For example:
mood == "sad" && weather == "rainy" && temperature == 0 -> "stay in bed"
temperature > 35 -> "go swimming"
Create a single-expression function for each condition and then use it in your when expression.

Challenge

Instead of passing in the mood, get a mood string from the user.

Hint: The !! operator may come handy.
Loops

This lesson introduced the while and repeat loops. To practice using them, do the following:
Change your fortune cookie program to use repeat() instead of a for loop. What happens to the break instruction? Using the error message from the compiler, with what you've learned so far, can you think of why?
Change your fortune cookie program to use a while loop, which is the better choice when you are looping until a condition is met.

首先是挑战练习的答案:

fun main(args: Array) {
   println(whatShouldIDoToday("happy", "sunny"))
   println(whatShouldIDoToday("sad"))
   print("How do you feel?")
   println(whatShouldIDoToday(readLine()!!))
}

fun isVeryHot (temperature: Int) = temperature > 35
fun isSadRainyCold (mood: String, weather: String, temperature: Int) =
mood == "sad" && weather == "rainy" && temperature == 0
fun isHappySunny (mood: String, weather: String) = mood == "happy" && weather == "sunny"
fun whatShouldIDoToday(mood: String, weather: String = "sunny", temperature: Int = 24) : String {
   return when {
      isVeryHot(temperature) -> "go swimming"
      isSadRainyCold(mood, weather, temperature) -> "stay in bed"
      isHappySunny(mood, weather) -> "go for a walk"
      else -> "Stay home and read."
   }
}

接下来如果我们在repeat语句中使用break的话,会报错,错误内容是:
break语句和continue只能在循环内部使用,说明在Kotlin中repeat不是一个循环

使用while:

fun main(args: Array) {
   var fortune: String = ""
   while (!fortune.contains("Take it easy")) {
       fortune = getFortune(getBirthday())
      println("\nYour fortune is: $fortune")
   }
}

你可能感兴趣的:(3、由函数提供默认参数)