夢とガラクタの集積場

落ちこぼれ三流エンジニアである管理人の夢想=『夢』と、潰えた夢=『ガラクタ』の集積場です。

駄目ネタで試すScala 名前付き引数 〜魔法少女まどか☆マギカ編〜

前回残っていた、『途中の引数を省略する場合はどうすればいいのか?』について。

デフォルト値によって引数が省略できるにしても、
『どの引数を指定し、どの引数を省略するか?』が指定できないと実際にはまともに使えません。

そんなわけで、scalaでは引数に名前を下記のように指定することが可能です。

メソッド名(引数名1 = 引数1, 引数名2 = 引数2, 引数名3 = 引数3)


実際に使ってみた例が下記。
■NamedArgsMain.scala

package jp.gr.kmtn.scalatutorial.defaultvalue

/**
 * 名前付き引数確認用メインクラス
 *
 * @author Fukushi-
 */
object NamedArgsMain {
  /**
   * 名前付き引数確認用プログラムエントリポイント
   */
  def main(args: Array[String]): Unit =
    {
      val ancientPuellaA = new PuellaMagi
      ancientPuellaA.sealToSoulJem("古代の魔法少女A")

      val ancientPuellaAA = new PuellaMagi
      ancientPuellaAA.sealToSoulJem(name = "古代の魔法少女AA")

      val ancientPuellaB = new PuellaMagi
      ancientPuellaB.sealToSoulJem("古代の魔法少女B", "魔法の剣")

      val ancientPuellaBB = new PuellaMagi
      ancientPuellaBB.sealToSoulJem(name = "古代の魔法少女BB", weapon = "魔法の剣")

      val ancientPuellaC = new PuellaMagi
      ancientPuellaC.sealToSoulJem(name = "古代の魔法少女C", magica = "この世の呪い")

      val madoca = new PuellaMagi
      madoca.sealToSoulJem("鹿目 まどか", "薔薇の枝の弓矢", "魔女を全ての時空から生まれる前に消しさる宇宙法則")

      val homura = new PuellaMagi
      homura.sealToSoulJem(name = "暁美 ほむら", weapon = "時の砂時計の盾", magica = "時間操作")

      val sayaka = new PuellaMagi
      sayaka.sealToSoulJem(magica = "治癒の魔法", weapon = "サーベル", name = "美樹 さやか")

      Console.println(ancientPuellaA)
      Console.println(ancientPuellaAA)
      Console.println(ancientPuellaB)
      Console.println(ancientPuellaBB)
      Console.println(ancientPuellaC)
      Console.println(madoca)
      Console.println(homura)
      Console.println(sayaka)
    }
}


実際に実行した結果は下記の通り。

魔法少女 名前:古代の魔法少女A 武器:魔法のステッキ 固有魔法:光の魔法
魔法少女 名前:古代の魔法少女AA 武器:魔法のステッキ 固有魔法:光の魔法
魔法少女 名前:古代の魔法少女B 武器:魔法の剣 固有魔法:光の魔法
魔法少女 名前:古代の魔法少女BB 武器:魔法の剣 固有魔法:光の魔法
魔法少女 名前:古代の魔法少女C 武器:魔法のステッキ 固有魔法:この世の呪い
魔法少女 名前:鹿目 まどか 武器:薔薇の枝の弓矢 固有魔法:魔女を全ての時空から生まれる前に消しさる宇宙法則
魔法少女 名前:暁美 ほむら 武器:時の砂時計の盾 固有魔法:時間操作
魔法少女 名前:美樹 さやか 武器:サーベル 固有魔法:治癒の魔法


下記のように引数の名前を指定することで、順不同で引数指定することが可能です。

homura.sealToSoulJem(name = "暁美 ほむら", weapon = "時の砂時計の盾", magica = "時間操作")
sayaka.sealToSoulJem(magica = "治癒の魔法", weapon = "サーベル", name = "美樹 さやか")


とまぁ、ただ当然ながら下記のような制約もあります。
1.名前付き引数と名前なし引数を1回のメソッド呼び出しの中に混在させることは出来ない
2.デフォルト値が定義されていない引数を省略してメソッド呼び出しをすることは出来ない

名前付き引数は多少記述が冗長になるかもしれませんが、
メソッド呼び出し部を見るだけで引数の大体の用途が分かるというのは非常に便利ですね。