【Scala】Scala ~ 可変長引数 ~

■ はじめに

今回は、Scalaの可変長引数について扱う

目次

【1】Scalaの可変長引数
【2】構文
【3】サンプル
【4】使用上の注意

【1】Scalaの可変長引数

* 関数の引数の個数を指定せずに引数を渡す方法
* Scalaでは可変長引数のことを
 「repeated parameters (=反復パラメータ)」って言うらしい

cf. 可変長引数 = Variable Arguments

【2】構文

* 以下で記述可能

def output(values: String*) { values.foreach(print) }

def output(values: String_*) { values.foreach(print) }

【3】サンプル

object Hello {
  def main(args: Array[String]): Unit = {
    // toList
    val result1s = toList("Hello", "world")
    println(result1s.get.mkString(","))

    val result2s = toList("1", "2", "3")
    println(result2s.get.mkString(","))

    val result3s = toList()
    println(result3s.isDefined)

    // toListWithFilter
    val result4s = toListWithFilter("Hello", "", "")
    println(result4s.get.mkString(","))

    val result5s = toListWithFilter("", "", "")
    println(result5s.isDefined)

    println("Done")
  }

  def toList(values: String*): Option[List[String]] = {
    if (values.isEmpty) None else Some(values.map(x => x).toList)
  }

  def toListWithFilter(values: String*): Option[List[String]] = {
    if (values.isEmpty)
      None
    else {
      val list = values.filter(x => x.nonEmpty).map(x => x).toList
      if (list.isEmpty) None else Some(list)
    }
  }
}

出力例

Hello,world
1,2,3
false
Hello
false
Done

【4】使用上の注意

* 可変長引数のメソッドでネストする場合、「_*」シンボルを指定する必要がある
 => 可変長引数として受け取った値もSeq型として扱われるため

object Hello {
  def main(args: Array[String]): Unit = {
    // toList
    val result1s = toList("Hello", "world", "")
    println(result1s.get.mkString(","))

    println("Done")
  }

  def toList(values: String*): Option[List[String]] = {
    // ★(values: _*)部分★
    if (values.isEmpty) None else toListWithFilter(values: _*)
  }

  def toListWithFilter(values: String*): Option[List[String]] = {
    if (values.isEmpty)
      None
    else {
      val list = values.filter(x => x.nonEmpty).map(x => x).toList
      if (list.isEmpty) None else Some(list)
    }
  }
}

参考文献

https://jumble-note.blogspot.com/2013/06/scala.html

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / Option型 ~
https://dk521123.hatenablog.com/entry/2023/03/09/000000
Scala ~ 基本編 / ジェネリック
https://dk521123.hatenablog.com/entry/2023/03/21/003817
Scala ~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
Scala ~ コレクションで使えるメソッド ~
https://dk521123.hatenablog.com/entry/2023/09/07/223422
Scala ~ mutable collection ~
https://dk521123.hatenablog.com/entry/2024/07/09/223730
Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000
Scala ~ 基本編 / 繰り返し ~
https://dk521123.hatenablog.com/entry/2023/01/24/000000
Scala ~ 基本編 / トレイト ~
https://dk521123.hatenablog.com/entry/2023/09/10/204016
Scala ~ 基本編 / パターンマッチング ~
https://dk521123.hatenablog.com/entry/2023/06/06/233614
Scala ~ 基本編 / 例外処理 ~
https://dk521123.hatenablog.com/entry/2023/10/05/000135
ScalaEnum
https://dk521123.hatenablog.com/entry/2023/01/05/000000
Scala ~ asInstanceOf / isInstanceOf ~
https://dk521123.hatenablog.com/entry/2024/07/26/225713
Scala ~ implicit ~
https://dk521123.hatenablog.com/entry/2024/07/24/120726
Scala ~ 代数的データ型 / ADT ~
https://dk521123.hatenablog.com/entry/2024/07/23/193246
Scala ~ Joda-Time ~
https://dk521123.hatenablog.com/entry/2024/07/10/001348
ScalaTest ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/27/001306
ScalaTest ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/03/28/003906
ScalaTest ~ あれこれ編 ~
https://dk521123.hatenablog.com/entry/2024/06/11/232020