拡張メソッド
型にメソッドを追加します。
「拡張メソッド」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
既存の型にメソッドを追加する
拡張メソッドを使うと、Int や String のように自分で所有していない型に、そのソースを変更せずに新しいメソッドを追加できます。Scala 3 では、このための構文がすっきりしています。
object Main:
extension (x: Int)
def squared: Int = x * x
def main(args: Array[String]): Unit =
println(5.squared)拡張メソッドの構文
extension (param: Type) に続けて、1 つ以上のメソッド定義を記述します。各メソッド内では、パラメーターがレシーバーの値を参照します。
object Main:
extension (s: String)
def shout: String = s.toUpperCase + "!"
def main(args: Array[String]): Unit =
println("hello".shout)1 つのブロックに複数のメソッドを定義する
1 つの extension 節に、同じレシーバー型に対して動作する複数のメソッドを定義できます。
object Main:
extension (x: Int)
def squared: Int = x * x
def cubed: Int = x * x * x
def isEven: Boolean = x % 2 == 0
def main(args: Array[String]): Unit =
println(4.squared)
println(3.cubed)
println(6.isEven)パラメーターを持つ拡張メソッド
拡張メソッドは、レシーバーに加えて独自のパラメーターも受け取れます。
object Main:
extension (x: Int)
def times(s: String): String = s * x
def main(args: Array[String]): Unit =
println(3.times("ab"))ジェネリックな拡張メソッド
拡張メソッドはジェネリックにでき、List[A] のような型の集合全体にメソッドを追加できます。
object Main:
extension [A](xs: List[A])
def second: A = xs(1)
def main(args: Array[String]): Unit =
println(List(10, 20, 30).second)
println(List("a", "b").second)暗黙の変換より拡張メソッドが優れている理由
拡張メソッドは、従来の「pimp-my-library」の目的をより安全に実現します。名前を付けたメソッドだけを追加するため、別の場所で型が暗黙に変換される危険がありません。
object Main:
extension (d: Double)
def percentOf(total: Double): Double = d / total * 100
def main(args: Array[String]): Unit =
println(25.0.percentOf(200.0))拡張メソッドと型クラス
拡張メソッドは型クラスと非常に相性がよく、given インスタンスで振る舞いを定義し、using を使ってメソッドとして公開できます。
trait Show[A]:
def show(a: A): String
object Main:
given Show[Int] with
def show(a: Int): String = s"<$a>"
extension [A](a: A)
def display(using s: Show[A]): String = s.show(a)
def main(args: Array[String]): Unit =
println(42.display)演算子を定義する
演算子は単なるメソッドなので、拡張メソッドを使って既存の型に記号演算子を追加することもできます。
object Main:
extension (x: Int)
def **(exp: Int): Int = math.pow(x, exp).toInt
def main(args: Array[String]): Unit =
println(2 ** 10)スコープとインポート
拡張メソッドは、スコープ内にある場所でのみ利用できます。オブジェクト内に定義してからインポートして使用することで、適用範囲を制御できます。
object StringOps:
extension (s: String)
def reversedWords: String = s.split(" ").reverse.mkString(" ")
object Main:
import StringOps._
def main(args: Array[String]): Unit =
println("hello there world".reversedWords)拡張メソッドを連鎖させる
拡張メソッドは通常の値を返すため、組み込みメソッドと連鎖させて、流れるようなパイプラインを構成できます。
object Main:
extension (s: String)
def emphasize: String = s"*$s*"
def main(args: Array[String]): Unit =
println("scala".toUpperCase.emphasize)実用的なヘルパー
拡張メソッドは、小さなドメイン用ヘルパーに最適です。呼び出し側のコードを自然に読めるようにできます。
object Main:
extension (n: Int)
def isPrime: Boolean =
n > 1 && (2 until n).forall(d => n % d != 0)
def main(args: Array[String]): Unit =
println((2 to 12).filter(_.isPrime).toList)確認問題
メソッドを追加する場合、Scala 3 の拡張メソッドが暗黙の変換より優れている主な理由は何ですか。
まとめ
拡張メソッドについて学びました。
extension (x: Type) def ...で既存の型にメソッドを追加できます- 1 つのブロックに、演算子を含む複数のメソッドを定義できます
- ジェネリックにしたり、パラメーターを受け取ったりできます
usingを介して型クラスと自然に組み合わせられます- 暗黙の変換より安全ですが、スコープ内にインポートする必要があります
よくある質問
「拡張メソッド」レッスンは無料ですか?
はい。「拡張メソッド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「拡張メソッド」で何を学びますか?
型にメソッドを追加します。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「拡張メソッド」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。