■ はじめに
今回は、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
Scala ~ Enum ~
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