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.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.