yu/logs/*

技術メモ など

英訳メモ Kotlinのループを改善する方法 How to Improve Loops in Kotlin | Kotlin Tips 2022

英語の勉強をしようと思い、KotlinのYouTubeを見てみています。

勉強用に英訳したメモです。

  • 筆者バックグラウンド
    • Kotlin力:JavaからKotlinに書き換える程度はできますが、Kotlinらしい書き方を習得できていないです。
    • 英語力:ほぼ無いです。誤訳を避けたければYouTubeの方を見た方がよさそうです。

今回見た動画

youtu.be

英訳メモ

// 改善のベースになるプログラム
// Javaっぽい書き方(個人的な感想)
val fruits = list<String> = listOf("Apple", "Banana", "Cherry", "Durian")
 
fun main() {
    for (index in 0 .. fruits.size - 1) {
        val fruit = fruits[index]
        println("$index: $fruit")
    }
}
  • 奇妙な -1 がある
  • これは..演算子が終端も含むrangeを作成するため
  • -1せずにfruits.sizeまでループするとOutOfBoundsエラーになる
  • Kotlinにはuntil演算子というもう一つのrange作成方法がある
    • 0 .. fruits.size - 10 until fruits.sizeと置き換えることが出来る
    • Inlay hintsを見ても分かる通り*1、終端を含まないrangeを作成する
    • 0 until fruits.sizeの場合に作成されるrange
      • 0:含む
      • fruits.size:含まない
  • これでもまだfruits.sizeがインデックスの終端を示していることが分かりづらい
    • 0 .. fruits.lastIndexと記述することで同等となる
    • こっちの方が意味を理解しやすい
  • さらに簡単に、独自にrangeを作成しない方法もある
    • 0 .. fruits.lastIndexfruits.indicesと書き換えることができる
// 上記までの内容を修正した結果
val fruits = list<String> = listOf("Apple", "Banana", "Cherry", "Durian")

fun main() {
    for (index in fruits.indices) {
        val fruit = fruits[index]
        println("$index: $fruit")
    }
}
  • forループの中でfruits[index]としてリストの値を取得しているが、冗長である*2
  • 本当にやりたいのはfruitsを使った反復処理
    • fruits.withIndexを使うと、val fruit = fruits[index]を削除し更に簡潔に書ける
// withIndex版.kt
val fruits = list<String> = listOf("Apple", "Banana", "Cherry", "Durian")

fun main() {
    for ((index, fruit) in fruits.withIndex) {
        println("$index: $fruit")
    }
}
  • 個人的な考え*3としてはfor eachよりもインデックスを使ったforループに近いと思う
  • また、collectionにチェインしてラムダ構文で書くこともできる*4
// ラムダ式版.kt
val fruits = list<String> = listOf("Apple", "Banana", "Cherry", "Durian")

fun main() {
    fruits.forEachIndexed { index, fruit ->
        println("$index: $fruit")
    }
}
  • これで同じ意味の実装をもう少し短く記述することができる

英語表現勉強メモ

  • weird
    • 奇妙、変、不可解
  • instead
    • 代わり
  • immediately
    • 直ちに、すぐ

*1:動画内で見れますが、IntellliJで見ると0 <= .. <= fruits.size、0 <= until < fruit.sizeというアシスト表示?みたいなものが出ます。これをInlay Hintsと呼ぶらしい

*2:直訳だと「冗長」というか、「少しばかげている」って言ってるかも・・・?

*3:※ここの「個人」はYouTubeで話している人自身です。

*4:ちょっと上手く解釈できてないかも