# 用邏輯控制一切！

很多時候我們會需要“**利用一些條件，決定我們要執行的事項**”，接下來我們就來看看在Kotlin裡面常見的幾種條件語法吧！

## if/else語句

首先我們先來看這個範例：

{% code title="ex. 4-1" %}

```kotlin
fun main() {
    var busArriveMinute = 5

    if (busArriveMinute == 0) {
        println("將到站")
    } else {
        println("${busArriveMinute}分鐘")
    }
}
```

{% endcode %}

我們可以看到這邊多了兩個關鍵字 “if” 跟 “else”，首先我們先來看看“if”的部分：

### 如果......怎麼樣的時候......就做什麼事......否則......就做另一件事

#### 首先我們看到在“if“後面會跟著一對“( )”跟一對“{ }”

* “( )”裡面可以放進“一句可以運算出布林值”的語句
* “{ }”裡面放入“如果上面的語句為true”時要執行的事情

#### 再來我們看到“else”後面有一對“{ }”

* “{ }”裡面放入“if那邊的( )內的語句為false”時要執行的事情
* else不可以單獨存在

### 我還需要更多！

上面介紹的“if/else”只能容納兩個條件，可是如果我們需要更多更多條件的話怎麼辦？ 這個時候就需要“else if”出場啦！

{% code title="ex. 4-2" %}

```kotlin
fun main() {
    var busArriveMinute = 5

    if (busArriveMinute == 0) {
        println("進站中")
    } else if (busArriveMinute <= 3) {
        println("將到站")
    } else {
        println("${busArriveMinute}分鐘")
    }
}
```

{% endcode %}

“else if”具備“if”跟“else”的部分性質

* “( )”裡面可以放進“一句可以運算出布林值”的語句
* “{ }”裡面放入“如果上面的語句為true”時要執行的事情
* 必須跟在“if”後面

### 巢狀條件語句(避免使用)

有些時候我們會需要多項條件才能做出判斷，這個時候我們可以在條件的執行區塊裡面再加入條件語句：

{% code title="ex. 4-3" %}

```kotlin
fun main() {
    var busArriveMinute = 5
    var shouldStop = true

    if (shouldStop) {
        if (busArriveMinute == 0) {
            println("進站中")
        } else if (busArriveMinute <= 3) {
            println("將到站")
        } else {
            println("${busArriveMinute}分鐘")
        }
    } else {
        println("不停靠")
    }
}
```

{% endcode %}

透過巢狀條件語句，我們可以加入多項條件完成判斷，讓我們的程式可以處理更多、更複雜的條件判斷

> “雖然巢狀條件判斷可以讓我們加入越來越多判斷條件，可是一旦條件變得越來越多，我們寫出來的Code也會變得越來&#x8D8A;***巢***。這樣不僅會妨礙我們閱讀，同時也容易造成維護上的困難，所以除非不得已的情況，建議儘量避免使用巢狀條件判斷。例如上面的範例，其實也可以改成這樣”
>
> ```kotlin
> fun main() {
>     var busArriveMinute = 5
>     var shouldStop = true
>
>     if (busArriveMinute == 0 && shouldStop) {
>         println("進站中")
>     } else if (busArriveMinute <= 3 && shouldStop) {
>         println("將到站")
>     } else if (shouldStop) {
>         println("${busArriveMinute}分鐘")
>     } else {
>         println("不停靠")
>     }
> }
> ```

### 條件運算式

接下來回到ex. 4-2裡面，我們會發現每個if/else區塊裡面，都有使用println這個函式。如果我們今天需要修改輸出資訊的方式，就會需要每個地方都改。這樣工作不僅繁瑣，也增加了不小心沒有改到的風險。那要怎麼解決呢？我們先來看看下面的例子：

{% code title="ex. 4-4" %}

```kotlin
fun main() {
    var busArriveMinute = 5

    val showText = if (busArriveMinute == 0) {
        "進站中"
    } else if (busArriveMinute <= 3) {
        "將到站"
    } else {
        "${busArriveMinute}分鐘"
    }

    println(showText)
}
```

{% endcode %}

在這個例子裡面我們會發現if/else語句可以“產生”一個值出來，然後設定給變數。具體來說我們可以使用判斷語句回傳值，而如果我們這樣做的話，將會輸出判斷區塊的最後一行輸出結果。這樣一來，我們就可以將輸出跟判斷的部分分開來撰寫，更容易閱讀、維護

> 這邊有一個值得注意的地方，就是如果我們要用條件判斷回傳數值，在最後都必須要加上else，以確保在任何條件下，都會有數值回傳

### 刪除 { } (避免使用)

在分支區塊裡面如果只有一行語句的情況，我們可以把“{ }”省略掉

{% code title="ex. 4-5" %}

```kotlin
fun main() {
    var busArriveMinute = 5

    val showText = if (busArriveMinute == 0) "進站中"
    else if (busArriveMinute <= 3) "將到站"
    else "${busArriveMinute}分鐘"

    println(showText)
}
```

{% endcode %}

> ‘為什麼儘量不要刪除{ }？’
>
> “在我們刪除{ }之後，可以發現區塊的界線變得不明確，尤其是當區塊內的語句不只一行的時候。就會越來越難閱讀，而且會容易搞錯區塊的範圍，造成不必要的麻煩，所以大部分的開發者都不太會這樣做”

## Range

在有一些語言裡面，這種多個數字區間要做判斷的寫法大多會用刪去法，不然就是得要使用

```kotlin
x > 0 && x <= 3
```

這種看起來不怎麼漂亮也比較不直觀的寫法。不過在Kotlin裡面提供了一個方便的數值範圍判斷工具：Range，接下來我們可以看看要怎麼使用Range改寫ex. 4-5裡面的判斷式

{% code title="ex. 4-6" %}

```kotlin
fun main() {
    var busArriveMinute = 5

    val showText = if (busArriveMinute == 0) "進站中"
    else if (busArriveMinute in 1..3) "將到站"
    else "${busArriveMinute}分鐘"

    println(showText)
}
```

{% endcode %}

這個範例裡面出現了兩個新的運算子“in”還有“..”，首先我們來介紹“..”：

### rangeTo

“..”是一個用來標示某個範圍的運算子，在上面範例的“1..3”代表“從1開始到3為止”的數字範圍

### contains

“in”則是用來檢查左邊的數值，有沒有包含在右邊的範圍裡面

## when運算式

當我們判斷的條件越來越多的時候，我們會覺得要寫很多if/else if/else if/....../else這樣顯得太笨重，而且讀起來依舊不夠直覺。在Kotlin裡面我們有更直覺的方法可以表示，那就是when運算式

{% code title="ex. 4-7" %}

```kotlin
fun main() {
    var busArriveMinute = 5

    val showText = when (busArriveMinute) {
        0 -> "進站中"
        in 1..3 -> "將到站"
        else -> "${busArriveMinute}分鐘"
    }

    println(showText)
}
```

{% endcode %}

在這個例子裡面我們可以看到when運算式的表示方式，在Kotlin裡面只要有用到else if的時候都建議更改成when運算式，而when運算式也有著else if沒有的一些優點，這個我們會在後面的講道列舉跟封裝類別的時候來探討。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kuroclass.gitbook.io/kotlin/ch4/yong-luo-ji-kong-zhi-yi-qie.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
