Scala練習問題から学ぶ:よりScalaらしいコードの書き方✨
こんにちは!今回はScalaの練習問題を通じて、Scalaらしいコードの書き方について学んだ内容を共有します。よりシンプルでわかりやすいコードをChatGPTに相談して教えてもらいました。
練習問題 🔍
以下はScala Textに掲載されている練習問題です:
練習問題
次のコードを利用して、最初と最後の文字が同じ英数字であるランダムな5文字の文字列を1000回出力してください。
new scala.util.Random(new java.security.SecureRandom()).alphanumeric.take(5).toList
上記コードはランダムな5個の文字(Char型)のリストを生成します。リストの一部を加工することで、最初と最後の文字が一致するようにしてください。
提示されていた解答例 📄
問題文に提供されていた解答例は以下の通りです:
for(i <- 1 to 1000) {
val s = new scala.util.Random(new java.security.SecureRandom()).alphanumeric.take(5).toList match {
case List(a,b,c,d,_) => List(a,b,c,d,a).mkString
}
println(s)
}
このコードは確かに動作しますが、match, caseを利用するのは冗長に感じられました。そのため、Scala標準ライブラリを活用してより簡潔な書き方をChatGPTに相談して教えてもらいました。
ChatGPTに相談して得たScalaらしいコード ✨
そこで、この問題をよりScalaらしいスタイルで簡潔に解く方法がないか、ChatGPTに相談してみました。その結果、以下の改善案を教えてもらいました。
提案 1: updatedを使ったリスト操作
(1 to 1000).foreach { _ =>
val chars = new scala.util.Random(new java.security.SecureRandom()).alphanumeric.take(5).toList
println(chars.updated(4, chars.head).mkString)
}
このコードのポイント: updatedの活用
- 生成したリストの5文字目(インデックス4)を、リストの先頭の文字に置き換えることで、最初と最後の文字を一致させています。
- パターンマッチングを使わない分、意図が明確で読みやすいコードになっています。
提案 2: 必要な文字数だけ生成する効率的な方法
もう1つの提案は、生成する文字数を最初から調整する方法です:
(1 to 1000).foreach { _ =>
val chars = new scala.util.Random(new java.security.SecureRandom()).alphanumeric.take(4).toList
println((chars ++ Iterator(chars.head)).mkString)
}
このコードのポイント
-
生成文字数の削減:
- 最初の4文字を生成し、先頭の文字を5文字目として追加するだけで済むため、余計な計算を省略できます。
-
Iteratorを活用:
- Scala標準ライブラリのIteratorを使って簡潔に1文字を追加しています。
ChatGPTを使った学び ✍️
この練習問題を通じて、以下の点を学びました:
- Scalaらしい書き方を意識する:
- 問題を解く際、解答が動作するだけではなく、コードの意図が明確で簡潔かどうかを考えることが大切です。
- 標準ライブラリを活用する:
- Scalaは豊富な標準ライブラリを持っており、
updated
やIterator
などを活用することで、より簡潔なコードが書けます。
- Scalaは豊富な標準ライブラリを持っており、
ChatGPTに相談した結果、解答例のmatch, caseに頼る方法ではなく、よりScalaらしい書き方を教えてもらい、コードを改善することができました。こうした練習を通じて、Scalaの深い理解を身につけることができると感じました。
Scalaを学ぶ皆さんも、ぜひこうした問題に挑戦しながら、より良いコードを書く楽しさを味わってみてください🚀✨
いろいろ見てみましたが「パターンマッチを使う例」というのが難しいのではないかとは思います。
Discussion