【KotlinとJava】複数言語での「Hello, world」

04 複数言語での「Hello, world」

KotlinとJava

ifに続き、もうひとつの条件分岐であるwhenの登場だ。

A multi-language Hello.kt

fun main(args: Array<String>) {
    val language = if (args.size == 0) "EN" else args[0]
    println(when (language) {
        "EN" -> "Hello!"
        "FR" -> "Salut!"
        "IT" -> "Ciao!"
        else -> "Sorry, I can't greet you in $language yet"
    })
}

リンク

if

まずはif文だ。この記述方法はJavaでいうところの三項演算子に似ている。しかし、ここで注目すべきなのは、if文は式としても利用することができるということだ。リファレンスを見ると、通常のスタイルのif文でも値を返却していることがわかる。

val max = if (a > b) {  
    print("Choose a")  
    a  
} else {  
    print("Choose b")  
    b  
}

when

次にwhen文である。Javaのswitch文に似ているが、こちらも式扱いで、値を返すことができる。->(アロー演算子)の先は{}で囲むことで以下のように記述ができる。ただし、最後の Hey! が式の結果として返却されるため、Hello!The expression is unusedという警告が出る。

println(when (language) {  
    "EN" -> {  
        println("Hello!")  
        "Hello!"  
        "Hey!"
    }  
    "FR" -> "Salut!"  
    "IT" -> "Ciao!"  
    else -> "Sorry, I can't greet you in $language yet"
})

whenに与える変数の型が決まっている場合、分岐先の型もそれに合わせる必要がある。つまり、次のような書き方はできない。(languageString型であるため、5 -> "Five"のところでコンパイルエラーが出てしまう)

val launguage: String = args[0]
println(when (language) {
    "EN" -> "Hello!"
    "FR" -> "Salut!"
    "IT" -> "Ciao!"
    5 -> "Five!"
    else -> "Sorry, I can't greet you in $language yet"
})

しかし式の結果は型がそろわなくとも許容してくれる(変数に代入する場合は警告が出る)

val result = when(language) {  
    "EN" -> "Hello"  
    "FR" -> 100  
    else -> false  
}  
println(result)

Javaで記述

public class Exp04 {  
    public static void main(String[] args) {  
        String language = args.length == 0 ? "EN" : args[0];  
        switch (language) {  
        case "EN":  
            System.out.println("Hello!");  
            break; 
        case "FR":  
            System.out.println("Salut!");  
            break;
        case "IT":  
            System.out.println("Ciao!");  
            break;
        default:  
            String template = "Sorry, I can't greet you in %s yet!";
            System.out.println(String.format(template, language));
            break;
        }  
    }  
}

だいぶ記述量が増えてきた。
式記述のif文のところは三項演算子を利用したが、場合によっては使えないこともあるだろう。
when文はswitch1を利用した。


  1. switch文のインデントには流派があると思うが、スペースを優先させていただいた。 ↩︎

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

wxPythonでのモーダルダイアログ作成