Kotlin Academy · レッスン

letとrun:変換とスコープ

null安全な変換にはletを、ローカルな計算にはrunを使用します。

レッスン 2/413 ステップ

「letとrun:変換とスコープ」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

letとrun

letはitをレシーバーとして使用し、runはthisを使用します。どちらもラムダの最後の式を返します。明示的な参照を好むかどうかで使い分けてください。

letの基本

letはレシーバーをitとしてラムダに渡します。値の変換や変数のスコープの限定に便利です。

fun main() {
    val length = "Kotlin".let { it.length }
    println(length) // 6
}

nullable値でのlet

よく使われるイディオムです。obj?.let { ... }は、objがnullでない場合にだけブロックを実行します。

fun main() {
    val name: String? = "Ada"
    val upper = name?.let { it.uppercase() } ?: "(unknown)"
    println(upper) // ADA
}

変換にletを使う

チェーンの読みやすさを保ちながら値を変換するには、letを使用します。

fun main() {
    val numStr = "42"
    val doubled = numStr.let { it.toInt() }.let { it * 2 }
    println(doubled) // 84
}

スコープの限定にletを使う

変数の可視性を小さなブロック内に限定できます。名前空間の汚染を避ける、すっきりした方法です。

fun main() {
    val username = readUserConfig().let { config ->
        config.uppercase()
    }
    println(username)
}
fun readUserConfig() = "ada"

runの基本

runはletと似ていますが、itではなくthisを使用します。レシーバーの複数のメンバーを呼び出したい場合に便利です。

class Rect(val w: Int, val h: Int) {
    fun area() = w * h
    fun perimeter() = 2 * (w + h)
}
fun main() {
    val description = Rect(3, 4).run {
        "area=${area()}, perimeter=${perimeter()}"
    }
    println(description)
}

独立したブロックとしてのrun

レシーバーなしのrun { ... }はブロックを実行し、その結果を返します。計算をまとめる場合に便利です。

fun main() {
    val result = run {
        val a = 10
        val b = 20
        a + b
    }
    println(result) // 30
}

レシーバーの参照方法でletとrunを使い分ける

ラムダ本体でレシーバーの多くのメンバーにアクセスする場合は、runを使うとit.を省略できます。レシーバーを1〜2回だけ使う場合は、letのほうが読みやすいでしょう。

class User(val name: String, val email: String, val age: Int)
fun main() {
    val user = User("Ada", "ada@x.io", 35)
    // run: this-style
    val s1 = user.run { "$name <$email> age $age" }
    // let: it-style
    val s2 = user.let { "${it.name} <${it.email}> age ${it.age}" }
    println(s1); println(s2)
}

letとElvis演算子の組み合わせ

?.let { ... }と?:の組み合わせは、強力なnull安全パイプラインのパターンです。

fun main() {
    val raw: String? = "  hello  "
    val cleaned = raw?.let { it.trim().uppercase() } ?: "(empty)"
    println(cleaned) // HELLO
}

設定と結果を扱うrun

thisによる設定と返り値を、1つのブロックにまとめられます。

class Connection {
    var host: String = ""
    fun connect() = "connected to $host"
}
fun main() {
    val status = Connection().run {
        host = "localhost"
        connect()
    }
    println(status)
}

アンチパターン:letの使いすぎ

ifのほうが明快な単純なnullチェックを、letで包まないでください。スコープ関数は、本当に役立つ場合に使用しましょう。

fun main() {
    val name: String? = "Ada"
    // OK
    name?.let { println(it.length) }
    // Equivalent and clearer for trivial cases:
    if (name != null) println(name.length)
}

クイックチェック

レシーバーをitとしてラムダに渡し、かつラムダの結果を返すスコープ関数はどれですか?

振り返り

letはitを使用し、ラムダの結果を返します。null安全な変換やスコープの限定に適しています。runはthisを使用し、ラムダの結果を返します。レシーバーの多くのメンバーを呼び出す場合に適しています。どちらも式形式のコードに向いています。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「letとrun:変換とスコープ」レッスンは無料ですか?

はい。「letとrun:変換とスコープ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「letとrun:変換とスコープ」で何を学びますか?

null安全な変換にはletを、ローカルな計算にはrunを使用します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「letとrun:変換とスコープ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. applyとwith:設定して返す
  2. letとrun:変換とスコープ
  3. also:レシーバーを変更せず副作用を実行する
  4. 適切なスコープ関数の選び方:判断ガイド
← Kotlin Academyに戻る