スマートキャストとは

KolinではJavaのように毎回明示的にキャストをする必要はありません。コンパイラがキャスト前の変数が明らかにキャスト後の変数と一致していると判断できる場合には自動的に安全なキャストが挿入されるようになっています。これをスマートキャストと呼びます。

例えば以下のコードではxは自動的にキャストされます。

fun demo(x: Any) {
    if (x is String) {
        print(x.length) //xは自動的にStringにキャストされている
    }
}

if文の条件文の中でxがStringであることをチェックしており、Stringであればlengthを出力するというコードですが、if文のボディでは条件文がtrue、すなわちxがStringであることが確定しているので、lengthを出す際にわざわざキャストしなくてもいいということです。

逆に以下のようにStringじゃなければreturnさせていれば、その後のreturnされていないコードではxはStringなので、同様にスマートキャストが適用されます。

if (x !is String) return

print(x.length) // xは自動的にStringにキャストされている

スマートキャストはwhen文を使用したコードでも適用されます。

when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}

when文の一つ目ではIntである場合の処理ですので、xはIntにスマートキャストされ、x+1も問題なく処理されます。以降の文も同様です。

スマートキャストは変数のチェックとその変数が使用されるまでの間に変数の中身が変わっていないということをコンパイラが確認できる場合にのみ有効です。具体的には以下のようなに決められています。

問題

以下のJavaコードをスマートキャストとwhenを使ってKotlinで書き換えてください。

Javaコード:

public int eval(Expr expr) {
    if (expr instanceof Num) {
        return ((Num) expr).getValue();
    }
    if (expr instanceof Sum) {
        Sum sum = (Sum) expr;
        return eval(sum.getLeft()) + eval(sum.getRight());
    }
    throw new IllegalArgumentException("Unknown expression");
}

Kotlinコード:

fun eval(expr: Expr): Int =
        when (expr) {
            is Num -> TODO()
            is Sum -> TODO()
            else -> throw IllegalArgumentException("Unknown expression")
        }

interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr

Kotlin Playgroundでコードの編集・動作確認ができます。

[expander_maker id=”1″ more=”答え” less=”非表示”]

答え

fun eval(expr: Expr): Int =
        when (expr) {
            is Num -> expr.value
            is Sum -> eval(expr.left) + eval(expr.right)
            else -> throw IllegalArgumentException("Unknown expression")
        }

interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]

データクラスとは

ある特定のデータを保持するためのクラスを作りたいということはよくありますよね。

Kotlinではそういったクラスはデータクラスと呼ばれ、クラス宣言の前にdataとつけることによって、データクラスにすることができます。

data class Car(val type: String, val number: Int)

データクラスにするメリットは一般的にデータを保持しているクラスに対して使われるメソッドが自動で生成されるという点です。自動で生成されるメソッドは以下になります。

問題

以下のJavaコードをKotlinコードに書き換えてください。

Javaコード

public class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

Kotlinコード

class Person

fun getPeople(): List<Person> {
    return listOf(Person("Alice", 29), Person("Bob", 31))
}

fun comparePeople(): Boolean {
    val p1 = Person("Alice", 29)
    val p2 = Person("Alice", 29)
    return p1 == p2  // trueになるようにしてください。
}

Kotlin Playgroundでコードの編集・動作確認ができます。

[expander_maker id=”1″ more=”ヒント” less=”非表示”]

ヒント

Kotlinにおけるクラス宣言の形式は以下のようになります。

class クラス名(パラーメーター){ /*…*/ }

パラメーターの中は(val type :String)など、(名前: 型)の形式で表されます。

例)

class Car(val type: String){}
[/expander_maker] [expander_maker id=”1″ more=”答え” less=”非表示”]

答え

data class Person(val name: String, val age: Int)

fun getPeople(): List<Person> {
    return listOf(Person("Alice", 29), Person("Bob", 31))
}

fun comparePeople(): Boolean {
    val p1 = Person("Alice", 29)
    val p2 = Person("Alice", 29)
    return p1 == p2  // trueになるようにしてください。
}

[解説]

data修飾子をclassの前につけることで、パラメーターの中身が自動でクラスメンバになり、上記で紹介したメソッドも使えるようになっています。

dataを無くすとコンパイルエラーがおこることを確認してください。

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]

ラムダ式の書き方

Kotlinにおけるラムダ式の正式な書き方は以下のようになります。

val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }

もし上記のラムダ式から全ての必須でないアノテーションを無くすと、以下のようになります。

val sum = { x: Int, y: Int -> x + y }

無くてもコンパイラが理解できる部分は無くすとだいぶスッキリしますね。

問題

コレクションに偶数が含まれているかをチェックするためのラムダ式をany関数に渡してください。

any関数は引数として述語(boolean値を出す式や関数)を取り、その述語を満たす(trueになる)要素が一つでもあれば、true返します。

fun containsEven(collection: Collection<Int>): Boolean =
        collection.any { TODO() }

Kotlin Playgroundでコードの編集・動作確認ができます。

[expander_maker id=”1″ more=”答え” less=”非表示”]

答え

fun containsEven(collection: Collection<Int>): Boolean =
        collection.any {it % 2 == 0}

[解説]

他にも

fun containsEven(collection: Collection<Int>): Boolean =
        collection.any {i -> i % 2 == 0}

など書き方はありますが、一つ目が一番シンプルな書き方です。

ラムダ式のパラメータが 1 つだけのときは、i -> の代わりに  it というパラメータ名で参照することができます。

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]

Nothing型とは

throwという式がKotlinにありますが、エルビス演算子(?:)を使った式の一部などで使われます。

val s = person.name ?: throw IllegalArgumentException("Name required")

throw式の型にはNothing型という特別な型が使われます。この型は特に値を持たず、コードが到達しえない場所を示すために使われます。また、Nothingを使うことで何も返さない関数をマークすることができます。

fun fail(message: String): Nothing {
    throw IllegalArgumentException(message)
}

この関数を呼び出す際、コンパイラーにこの関数の呼び出しより先は実行しないということを知らせることができます。

val s = person.name ?: fail("Name required")
println(s)     // person.nameがnullだった場合、failが呼び出され、sは出力されない。

また、型推論がされるときにもこの型が見られます。

この型のnull許容型はNothing?ですが、nullしか代入されることはありません。もし型推論の値を初期化するのにnullを使い、他に特定の型を決めるのに使われ得る情報がない場合、コンパイラーはNothing?型であると推測します。

val x = null           // xはnothing?型です
val l = listOf(null)   // lはList<Nothing?>型です

問題

failWithWrongAge関数の戻り値にNothing型を指定してください。

import java.lang.IllegalArgumentException

fun failWithWrongAge(age: Int?)    {
    throw IllegalArgumentException("Wrong age: $age")
}

fun checkAge(age: Int?) {
    if (age == null || age !in 0..150) failWithWrongAge(age)
    println("Congrats! Next year you'll be ${age + 1}.")
}

fun main() {
    checkAge(10)
}

Kotlin Playgroundでコードの編集・動作確認ができます。

[expander_maker id=”1″ more=”答え” less=”非表示”]

答え

import java.lang.IllegalArgumentException

fun failWithWrongAge(age: Int?): Nothing {
    throw IllegalArgumentException("Wrong age: $age")
}

fun checkAge(age: Int?) {
    if (age == null || age !in 0..150) failWithWrongAge(age)
    println("Congrats! Next year you'll be ${age + 1}.")
}

fun main() {
    checkAge(10)
}
[解説]

fun failWithWrongAge(age: Int?): Nothingとすることで戻り値をNothing型に指定しています。

Nothing型がないとcheckAge関数がコンパイルされないということが重要です。コンパイラーはageがnullである場合を考えてしまうためです。

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]

Null許容型とは

Kotlinの型システムでは、null参照の危険性を排除することに重点が置かれています。

Javaを含む多くのプログラミング言語における落とし穴の一つが、null参照のメンバにアクセスしようとすることによりnull参照エクセプション、いわゆるヌルポ(NullPointerException)を起こしてしまうことです。

Kotlinの型システムはnullである可能性のある参照(null許容参照)とnullがあり得ない参照(非null許容参照)とを区別します。例えば、通常のString型の変数はnullを持つことはあり得ません。

var a: String = "abc" // 通常の初期化ではデフォルトでnullはあり得ない
a = null // コンパイルエラーが起こります

nullを許容するには、String?と書いて、null許容Stringとして宣言する必要があります。

var b: String? = "abc" // nullがありえる
b = null // OK
print(b)

a上(nullがあり得ない)でメソッドを呼び出したり、aのプロパティにアクセスしようとしても、ヌルポが発生しないが保証されているので、以下のようなコードを安全に行うことができます。

val l = a.length

ですが、もし同じようにbのプロパティにアクセスしようとすると、nullセーフではないため、コンパイルエラーが起こります。

val l = b.length // エラー: 変数'b' はnullの可能性がある

しかしbのプロパティにアクセスする必要がある場合もありますよね?そのためにはいくつか方法があります。

条件文でnullチェックをする

第一の方法は、明示的にbがnullであるかをチェックすることで、nullの場合かそうでない場合かで別々の処理を行わせることができます。

val l = if (b != null) b.length else -1

コンパイラーはあなたが行ったnullチェックに関する情報を辿るので、if文の中ではlengthを呼び出すことができるようになるのです。以下のように、より複雑な条件文もありえます。

val b: String? = "Kotlin"
if (b != null && b.length > 0) {
print("String of length ${b.length}")
} else {
print("Empty string")
}

これはnullチェックのあとでbの状態が変わり得ない状況でのみ機能するということを覚えておいてください。つまりbがnullチェックとbを使用する間に、bの内容が書き換えられないローカル変数であるということを意味します。
そうでないと、nullチェックのあとにbがnullに変わってしまう可能性があり、チェックの意味がなくなってしまうからです。

安全な呼び出し

二つ目の方法は安全呼び出し演算子である ?. を使うことです。

val a = "Kotlin"
val b: String? = null
println(b?.length)
println(a?.length) //不必要な安全呼び出し

これはbがnullでなければb.lengthを返し、そうでなければnullを返します。これで返ってくる式の型はInt?です。

安全な呼び出しはチェーンの中で特に便利です。例えば、ボブ(Bob)という従業員がいて(もしかしたらいないかもしれない)、ある部署(Department)に配属され(されないかもしれない)、そこには部長(Head)がいます(いないかもしれない)。そういった場合での部長の名前を取得するコードは以下のようになります。

bob?.department?.head?.name

上のチェーンではbob、department、headのうち、どれか一つでもnullだった場合はnullを返します。

nullでない値に対してのみ、特定の処理を行わせたい場合は、letと安全呼び出し演算子を併用することで実現できます。

val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
    item?.let { println(it) }
}

上記のコードでは、item?の中身がnullでない場合はそれを出力します。nullの場合は無視されます。ですので、実行結果は”Kotlin”のみが出力されます。

また、安全な呼び出しは代入の左辺に来ることもあります。その場合、左辺(代入される側)にあるチェーン内の一つでもnullであった場合、その代入はスキップされ、右辺の式はそれ以上評価されません。

// もしpersonかperson.departmentがnullの場合、関数getManager()は呼び出されない。
person?.department?.head = managersPool.getManager()

問題

以下のJavaコードを一つのif文だけを使うようにKotlinで書き換えてください。(下のKotlinコードのTODO()を書き換えてください)

Javaコード:

public void sendMessageToClient(
    @Nullable Client client,
    @Nullable String message,
    @NotNull Mailer mailer
) {
    if (client == null || message == null) return;

    PersonalInfo personalInfo = client.getPersonalInfo();
    if (personalInfo == null) return;

    String email = personalInfo.getEmail();
    if (email == null) return;

    mailer.sendMessage(email, message);
}

Kotlinコード:

fun sendMessageToClient(
        client: Client?, message: String?, mailer: Mailer
) {
    TODO()
}

class Client(val personalInfo: PersonalInfo?)
class PersonalInfo(val email: String?)
interface Mailer {
    fun sendMessage(email: String, message: String)
}

Kotlin Playgroundでコードの編集・動作確認ができます。

[expander_maker id=”1″ more=”答え” less=”非表示”]

答え

fun sendMessageToClient(
        client: Client?, message: String?, mailer: Mailer
) {
    val email = client?.personalInfo?.email
    if (email != null && message != null) {
        mailer.sendMessage(email, message)
    }
}

class Client(val personalInfo: PersonalInfo?)
class PersonalInfo(val email: String?)
interface Mailer {
    fun sendMessage(email: String, message: String)
}

[解説]

null許容型を使用しているので、Javaのように最初にclientとmessageのnullチェックをする必要はありません。val email = client?.personalInfo?.emailで、clientとpersonalInfoの両方がnullでなければ、emailを代入しています。

その後で、emailとmessageがnullでなければ、sendMessageメソッドに値を渡しています

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]

Stringテンプレートとは

String文字列にはテンプレート式というものが含まれる場合があります。これはコードの値が評価されてから、文字列として連結されるものです。テンプレート式はドルマーク($)で始まり、その後に変数名や、中括弧({})などが来ます。

val i = 15
println("i = $i") // "i = 15"と出力される

または

val s = "abc"
println("$s.length is ${s.length}") // "abc.length is 3"と出力される

正規表現

トリプルクォートで囲われた生の文字列は複数行の文字列用だけに使われるものではありません。バックスラッシュをバックスラッシュでエスケープすることなく、正規表現を作成するためにも使えます。

比較:

// 生の文字列はバックスラッシュのエスケープがいらない
"""\d"""

// 普通の文字列だとバックスラッシュのエスケープが必要
"\\d"

以下のパターンは15.07.1996(2桁の数字、ドット、2桁の数字、ドット、4桁の数字)というフォーマットで表される日付に合致します。

fun getPattern() = """\d{2}\.\d{2}\.\d{4}"""

問題

month変数を使って、上記のfun getPattern()を15 JUL 1996(2桁の数字、空白、英語での月の略称、空白、4桁の数字)というフォーマットでの日付に合致するように書き換えてください。

val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"

fun getPattern(): String = TODO()

Kotlin Playgroundでコードの編集・動作確認ができます。

[expander_maker id=”1″ more=”答え” less=”非表示”]

答え

val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"

fun getPattern(): String = """\d{2} $month \d{4}"""
[解説]

Stringテンプレートとして$monthを使うことで、monthの実際の中身が評価されてから文字列に結合されます。また正規表現において、\dは0から9までの何かしらの数字、{}の中の数字は直前の正規表現が何回連続しているかを表しています。

したがって、\d{2}は何かしらの数字が二回続いている=二桁の数字という意味になります。

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]

Kotlin問題集

Kotlin練習問題シリーズのリストです。(随時更新中)

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]

Kotlinにおける文字列

Kotlinには二種類のString文字列があります。

エスケープ文字を含むStringと、改行を含む文字列です。
エスケープを含む文字列とは以下のようなものです。

val s = "Hello, world!\n"

エスケープはバックスラッシュ(\)によって示され、\nは改行を意味します。エスケープを含まない文字列のことを生文字列(raw string)と呼びますが、以下のようなものを示します。

生文字列はトリプルクォート(“””)によって表され、エスケープを含まずに改行やその他の文字を表すことができます。

val text = """
    for (c in "foo")
        print(c)
"""

trimMargin

生文字列から文頭の空白を削除するにはtrimMargin()関数を使用します。

val text = """
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()

上記の場合|の前にある空白(コード上には半角4つ分の空白があります)は全て削除され、空白と|が無くなった状態になります。ここでの|のことをマージン接頭辞と呼びますが、trimMargin()のデフォルトでのマージン接頭辞は|に設定されています。trimgMargin(“>”)のように引数に任意の文字を渡すことで、それをマージン接頭辞として設定することができます。

trimIndent

単純に文頭の空白を削除するだけであれば、trimIndent()関数も使うことができます。

val withoutIndent =
    """
            ABC
            123
            456
        """.trimIndent()
println(withoutIndent)

上記のコードは最終的に

ABC
123
456

のように空白が無い状態で表示されます。

注意したいのはtrimIndentは全ての行の中から最小のインデント数を調べ(今回は全て半角12個)、それを全ての行から削除します。ですので、

val withoutIndent =
    """
ABC
            123
            456
            
        """.trimIndent()
println(withoutIndent)

のように、一行でもインデントが0であった場合、trimIndent()は全行から何も削除しないことになります。出力結果はコードで表示されているのと同じになります。

問題

const val question = "life, the universe, and everything"
const val answer = 42

val tripleQuotedString = """
    #question = "$question"
    #answer = $answer""".trimIndent()

fun main() {
    println(tripleQuotedString)
}

上記のコード中のtrimIndentをtrimMarginで置き換え、最終的にメインメソッドで表示される文字列に#が含まれないようにしてください。

Playgroundでコードの編集および動作確認ができます。

[expander_maker id=”1″ more=”答え” less=”非表示”]

答え

const val question = "life, the universe, and everything"
const val answer = 42

val tripleQuotedString = """
    #question = "$question"
    #answer = $answer""".trimMargin("#")

fun main() {
    println(tripleQuotedString)
}
[解説]

trimMarginのマージン接頭辞に#を渡すことで、tripleQuotedString内のそれぞれの行のはじめの#を取り除いています。また#の前にある空白も削除されています。

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]

問題

今回はKotlinにおけるデフォルト引数に関する確認問題です。前回の名前付き引数の問題でも、デフォルト引数に関しては少し説明しましたね。

Javaにおいて以下のような関数foo()のオーバーロードがあるとします。

public String foo(String name, int number, boolean toUpperCase) {
    return (toUpperCase ? name.toUpperCase() : name) + number;
}
public String foo(String name, int number) {
    return foo(name, number, false);
}
public String foo(String name, boolean toUpperCase) {
    return foo(name, 42, toUpperCase);
}
public String foo(String name) {
    return foo(name, 42);
}

これらのJavaのオーバーロードを表すコードはKotlinを使えば一つの関数で置き換えることができます。

以下のコード内の関数foo()の宣言を変更して、上記のコードと同じ挙動をするようにしてください。

fun foo(name: String, number: Int, toUpperCase: Boolean) =
        (if (toUpperCase) name.toUpperCase() else name) + number

fun useFoo() = listOf(
        foo("a"),
        foo("b", number = 1),
        foo("c", toUpperCase = true),
        foo(name = "d", number = 2, toUpperCase = true)
)

リンク先のKotlin公式サイトが提供しているKotlin Playgroundでブラウザ上で簡単にコードの編集・動作確認ができます!便利ですね!

[expander_maker id=”1″ more=”ヒント” less=”非表示”]

ヒント:デフォルト引数の使い方

foo(“a”)は引数にStringしか渡されていません。この場合、Javaのほうのオーバーロードを確認すると、numberには42、toUpperCaseにはfalseが渡される仕様になっています。

Kotlinにおいて引数に値が渡されなった場合のデフォルト値の設定方法は

number: Int = 42のようにパラメーター設定をします。

[/expander_maker] [expander_maker id=”1″ more=”答え” less=”非表示”]

答え

fun foo(name: String, number: Int = 42, toUpperCase: Boolean = false) =
        (if (toUpperCase) name.toUpperCase() else name) + number

fun useFoo() = listOf(
        foo("a"),
        foo("b", number = 1),
        foo("c", toUpperCase = true),
        foo(name = "d", number = 2, toUpperCase = true)
)
[解説]

useFoo()内では、fooを四回呼び出しています。一回目ではname “a”のみを渡しているため、numberとtoUpperCaseにはデフォルト値として42,falseが入ります。

同様に二回目では、nameとnumberのみが渡されているため、toUpperCaseにはfalseが自動で入ります。

あらかじめデフォルト値を設定しておくことで、Javaのように何度もオーバーロードをする必要が無くなります。

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]

問題

fun joinOptions(options: Collection<String>) =
        options.joinToString(TODO())

上記コードのTODO()の中で、引数を二つだけ指定して、関数joinOptions()にJSON型のリスト(“[a,b,c]”など)を返すようにしてください。

デフォルト引数と名前付き引数はオーバーロードの数を最小化し、関数の呼び出しの可読性を向上させることができます。ライブラリ関数であるjoinToStringは以下のように、パラメーター用のデフォルト値と共に宣言されています。

fun joinToString(
    separator: String = ", ",
    prefix: String = "",
    postfix: String = "",
    /* ... */
): String

joinToStringはString型のリスト上で呼び出すことができます。

リンク先のKotlin公式サイトが提供しているKotlin Playgroundでブラウザ上で簡単にコードの編集・動作確認ができます!便利ですね!

下の[ヒント][答え]をクリックすると、それぞれ表示されます。

[expander_maker id=”1″ more=”ヒント” less=”非表示”]

デフォルト引数と名前付き引数

関数パラメーターはデフォルト値を持たせることができます。デフォルト値は対応する引数を省略したときに自動で使われるものです。これによってほかの言語に比べて、オーバーロードの数を減らすことができるのです。

fun read(
    b: ByteArray,
    off: Int = 0,
    len: Int = b.size,
) { /*...*/ }

デフォルト値は型の後にを使って指定します。ですので、上記の関数の場合、ユーザーがoffやlenに対応する引数をしなかった場合、自動でoffには0が、lenにはb.sizeが代入されます。

また、offをスキップしてlenのみに指定した値を代入したい場合、どちらもIntですので、何も指定せずにIntを一つ置いた場合、先にoffにその値が代入され、lenはデフォルト値になってしまいます。

それを避けるためにはread(byteArray, len=5)のように、明示的に引数の名前を指定することで、offにはデフォルト値の0が、lenには指定した5が代入されるようになります。

[/expander_maker] [expander_maker id=”1″ more=”答え” less=”非表示”]
fun joinOptions(options: Collection<String>) =
        options.joinToString(prefix ="[", postfix = "]")

[解説]

joinToString関数の引数の名前を指定してprefixには”[“を、postfixには”]”を渡すことで、何も渡していないseparatorは自動でデフォルト値の”,”になります。

結果を出力して確認したい人はPlaygroundに

fun main() {
    fun joinOptions(options: Collection<String>) =
        options.joinToString(prefix ="[", postfix = "]")
        
    print(joinOptions(listOf("a", "b")))
}

などと入力して、JSON型に変換されていることを見てみるといいでしょう。

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]