Scala 函数怎么用可变参数?

文章导读
Previous Quiz Next 本章将带您了解 Scala 编程中具有可变参数(varargs)的函数概念。这样,您可以定义操作多个值的函数,而无需单独指定每个值。您可以向函数传递不同数量的参数,从而提高代码的灵活性和可用性。
📋 目录
  1. 可变参数
  2. 与固定参数结合的 Varargs
  3. 向 Varargs 参数传递序列
  4. 带默认参数的可变参数
  5. 伴生对象中的可变参数
  6. 具有可变参数的函数总结
A A

Scala - 具有可变参数的函数



Previous
Quiz
Next

本章将带您了解 Scala 编程中具有可变参数(varargs)的函数概念。这样,您可以定义操作多个值的函数,而无需单独指定每个值。您可以向函数传递不同数量的参数,从而提高代码的灵活性和可用性。

可变参数

可变参数也称为 varargs。您可以向函数传递可变数量的相同类型的参数。当确切的参数数量事先未知且可在运行时变化时,会使用此概念。

具有可变参数的函数 可以接受零个或多个指定类型的参数。您需要在函数参数列表中使用 *(重复)类型。

语法

可变参数的语法 -

def functionName(param1: DataType, param2: DataType*): ReturnType = {
  // function body
}

示例

以下示例演示了 Scala 中一个简单的具有可变参数的函数 -

object Demo {
  def printAll(strings: String*): Unit = {
    strings.foreach(println)
  }

  def main(args: Array[String]): Unit = {
    // 用可变数量的参数调用函数
    printAll("Scala", "is", "awesome!")
    printAll("Hello", "World")
  }
}

将上述程序保存为 Demo.scala。使用以下命令编译并执行此程序。

命令

> scalac Demo.scala
> scala Demo

输出

Scala
is
awesome!
Hello
World

在示例中,printAll 函数接受可变数量的 String 参数。函数使用 foreach 方法打印每个参数。main 方法使用不同数量的参数调用 printAll。

与固定参数结合的 Varargs

您还可以在具有可变参数的函数中使用固定参数。但在函数定义中,固定参数必须位于 varargs 参数之前。

示例

使用固定参数和 varargs 的简单示例 -

def printMessage(prefix: String, messages: String*): Unit = {
  messages.foreach(msg => println(s"$prefix: $msg"))
}

object Demo {
  def main(args: Array[String]): Unit = {
    // 使用固定参数和可变参数调用函数
    printMessage("Info", "Scala", "is", "fun")
    printMessage("Warning", "Low disk space")
  }
}

将上述程序保存为 Demo.scala。使用以下命令编译并执行此程序。

命令

> scalac Demo.scala
> scala Demo

输出

Info: Scala
Info: is
Info: fun
Warning: Low disk space

在此示例中,printMessage 函数接受一个固定的 prefix 参数。它还接受可变数量的 message 参数。函数会打印每个以提供的 prefix 为前缀的消息。main 方法使用固定参数和可变参数调用 printMessage。

向 Varargs 参数传递序列

您可以使用特殊的 :_* 符号将序列(例如 array 或 list)传递给 varargs 参数。

示例

向 varargs 参数传递序列的简单示例 -

def sum(numbers: Int*): Int = {
  numbers.sum
}

object Demo {
  def main(args: Array[String]): Unit = {
    val nums = List(1, 2, 3, 4, 5)
    // 向 varargs 参数传递序列
    println(s"Sum: ${sum(nums: _*)}")
  }
}

将上述程序保存为 Demo.scala。使用以下命令编译并执行此程序。

命令

> scalac Demo.scala
> scala Demo

输出

Sum: 15

在此示例中,sum 函数接受可变数量的 Int 参数并返回它们的和。main 方法使用 :_* 符号将整数列表传递给 sum 函数。

带默认参数的可变参数

具有可变参数的函数也可以有默认参数。如果没有为参数传递参数,你可以为参数提供默认值。

示例

带默认参数的可变参数的简单示例是 -

def printLogs(logLevel: String = "INFO", messages: String*): Unit = {
  messages.foreach(msg => println(s"$logLevel: $msg"))
}

object Demo {
  def main(args: Array[String]): Unit = {
    // 使用带默认参数的可变参数
    printLogs(messages = "Application started", "Listening on port 8080")
    printLogs("ERROR", "NullPointerException encountered")
  }
}

将上述程序保存到 Demo.scala 中。使用以下命令编译并执行此程序。

命令

> scalac Demo.scala
> scala Demo

输出

INFO: Application started
INFO: Listening on port 8080
ERROR: NullPointerException encountered

在这个示例中,printLogs 函数接受一个默认的 logLevel 参数。它还具有可变数量的 message 参数。该函数使用指定的日志级别打印每个消息。main 方法在指定和不指定 logLevel 的情况下调用 printLogs。

伴生对象中的可变参数

Scala 中的伴生对象可以包含具有可变参数的函数。这些函数可以用来提供与伴生类相关的更多功能。

语法

伴生对象中可变参数的语法是 -

class ClassName {
  // 类定义
}

object ClassName {
  def functionName(param1: Type1, param2: Type2, ..., paramN: TypeN*): ReturnType = {
    // 函数体
  }
}

示例

以下示例展示了一个伴生对象中具有可变参数的函数 -

class Person(val name: String)

object Person {
  def printNames(persons: Person*): Unit = {
    for (person <- persons) {
      println(person.name)
    }
  }
}

object Demo {
  def main(args: Array[String]) = {
    val p1 = new Person("Alice")
    val p2 = new Person("Bob")
    val p3 = new Person("Charlie")

    // 调用具有可变参数的函数
    Person.printNames(p1, p2, p3)
  }
}

将上述程序保存到 Demo.scala 中。使用以下命令编译并执行此程序。

命令

> scalac Demo.scala
> scala Demo

输出

Alice
Bob
Charlie

在这个示例中,Person 类有一个伴生对象。它具有 printNames 函数,该函数接受可变数量的 Person 对象并打印它们的名字。

具有可变参数的函数总结

  • 函数可以接受可变数量的参数。因此,它增强了灵活性。
  • 你需要在函数参数列表中使用 *(重复)类型来表示可变参数。
  • 函数中可以有其他参数与可变参数一起存在。但这些其他参数必须出现在 varargs 参数之前。
  • 也可以有默认参数与可变参数一起存在。但这些默认参数必须出现在 varargs 参数之前。因此,可以实现灵活且可读的函数调用。
  • 伴生对象可以包含具有可变参数的函数。因此,你可以添加与伴生类相关的更多功能。
  • 你可以使用 :_* 将一个 sequence 传递给 varargs 参数。
  • 当输入数量未知时,可变参数用于函数,例如日志记录、字符串格式化或数学运算。