[毎日Kotlin] Day1.Hello, world!

2018.01.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

毎日Kotlinシリーズです。

このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO

問題

一日目にふさわしい問題。みんな大好きHello, world!です。

TODO()を書き換えて、checkボタンを押すとあっているか確認できます。 Hello, world! | Try Kotlin

Simple Functions
Take a look at function syntax and make the function start return the string "OK".

In the tasks the function TODO() is used that throws an exception. Your job during the koans will be to replace this function invocation with a meaningful code according to the problem.


fun start(): String = TODO()

TODO()を書き換えてstartがOKをreturnするようにしてみましょう。

狙い

ここで考えて欲しい問題の意図はなんだろうか?

  • Kotlinで関数の書き方を覚えよう。Javaとどう違うか考察してみよう。
  • 発展:クラスなしでなんで関数かけるんだ?

解答例

回答例です。ちゃんと公式の定義を知りたい方は、こちらを参照。Basic Syntax - Kotlin Programming Language

Javaだとこんな感じかな?

public class JavaStart{
    public static String start(){
        return "OK";
    }
}

何も省略しない関数の書き方から。;付けがちですが、いらないです。

fun start(): String {
    return "OK"
}

どんどん省略していきます。関数が一行でかける場合、{}が=で書くことができ、returnを省略

fun start(): String = "OK"

"OK"がStringと型推論できるので、返り値の型が省略可能です

fun start() = "OK"

余談ですが、checkボタンを押すとテストコードが実行されるだけなので、コード検証はしてません。グリーンならみんな正解!やったね!

テストコードまでついてるなんてなんて親切なんでしょう。そしてこのテストコードの書き方はとても参考になるので、解くだけでなくテストコードも読んで堪能しましょう。

テストコード

class TestStart {
    @Test fun testOk() {
        Assert.assertEquals("OK", start())
    }
}

発展:クラスなしでなんで関数かけるんだ?

100%Java互換なのに、どうやっているのだろう。黒魔術を使っているのかな?

Android Studio or IntellJでバイトコードにして、Javaに戻してみます。Test.kt というファイルを作り、先程のコードを作ります。

fun start(): String = "OK"

Javaに戻すと。

@Metadata(
   mv = {1, 1, 9},
   bv = {1, 0, 2},
   k = 2,
   d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u000e\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
   d2 = {"start", "", "test sources for module app"}
)
public final class TestKt {
   @NotNull
   public static final String start() {
      return "OK";
   }
}

ごちゃごちゃアノテーションがついてるけど。

なんだファイル名のクラスが作られて、staticメソッドが作られてるだけですね。Kotlinは黒魔術ではなく、Javaで書いたら泥黒いところをよしなにやってくれているいいやつなんだな。

恐くなくなりましたね?

Day2.でまたお会いしましょう。