7.7. Parametry powtórzone
Deklaracja ostatniego parametru na liście parametrów metody może zostać uzupełniona o znak *. Uzupełniony o ten znak parametr jest nazywany parametrem powtórzonym. Metody mające powtórzony parametr mogą przyjmować zmienną liczbę argumentów. Przykład definicji takiej metody znajduje się w pliku RepeatedParameters1.scala.
Plik RepeatedParameters1.scala: def arguments(args: String*):String = { def argString(as: Seq[String]): String = if (as.isEmpty) "" else " " + as.head + argString(as.tail) "arguments:" + argString(args) }
Parametr powtórzony może przyjąć zerową lub dodatnią liczbę argumentów. Typem parametru args jest scala.Seq[String], co oznacza sekwencję wartości typu String. Ogólnie, dla parametru T* jest to scala.Seq[T]. Przykłady ilustrują wywoływanie metody arguments z różną liczbą argumentów.
![]() | Typ scala.Seq[T] reprezentuje sekwencje wartości typu T i jest opisany dokładniej w rozdziale 18. |
scala> :load RepeatedParameters1.scala
Loading RepeatedParameters1.scala...
arguments: (args: String*)String
scala> arguments()
res0: String = arguments:
scala> arguments("A")
res1: String = arguments: A
scala> arguments("A","B")
res2: String = arguments: A B
scala> arguments("A","B","C","D")
res3: String = arguments: A B C D
Wywołując metodę mającą powtórzony parametr można użyć tak zwanego argumentu w postaci ciągu. W tym celu, w miejsce powtórzonego parametru mającego typ T*, należy przy wywołaniu metody podać pojedynczy argument typu zgodnego ze scala.Seq[T] uzupełniony o adnotację typu _*, którą umieszcza się po dwukropku. Poniżej znajduje się przykład wywołania metody greet z pliku RepeatedParameters1.scala przy użyciu argumentu w postaci ciągu. Użyte w przykładzie wyrażenie Seq("John","Peter","Ron") tworzy sekwencję zawierającą trzy łańcuchy znakowe.
scala> val args: Seq[String] = Seq("A","B","C")
args: Seq[String] = List(A, B, C)
scala> arguments(args: _*)
res4: String = arguments: A B C
Lista parametrów zawierająca deklarację parametru powtórzonego nie może mieć parametru z argumentem domyślnym.
Plik RepeatedParameters2.scala: def arguments(msg: String = "arguments:", args: String*):String = { def argString(as: Seq[String]): String = if (as.isEmpty) "" else " " + as.head + argString(as.tail) msg + argString(args) }
Definicja metody greet znajdująca się w pliku RepeatedParameters2.scala jest z tego powodu nieprawidłowa.
scala> :load RepeatedParameters2.scala
Loading RepeatedParameters2.scala...
<console>:11: error: a parameter section with a `*'-parameter is not allowed to have default arguments
def arguments(msg: String = "arguments:", args: String*):String = {
^
![]() | Specyfikacja języka Scala opisuje parametry powtórzone w punkcie 4.6.3. |
Plik RepeatedParameters1.scala:
def arguments(args: String*):String = {
def argString(as: Seq[String]): String =
if (as.isEmpty) "" else " " + as.head + argString(as.tail)
"arguments:" + argString(args)
}

