1. 概述

在本教程中,我们将深入探讨 Scala 对命名参数(Named Arguments)和默认参数(Default Arguments)的支持。这两个特性可以显著提升代码的可读性和灵活性,我们也会通过具体示例来展示它们的实际应用。

2. 默认参数

在 Scala 中,方法的参数可以设置默认值。当我们为参数设置了合理的默认值后,调用方就可以少写一些代码,提升开发效率

来看一个例子:

def prettyPrint[A](input: Array[A],
                   start: String = "(",
                   separator: String = ",",
                   end: String = ")"): String = input.mkString(start, separator, end)

这个 prettyPrint 方法用于将一个泛型数组格式化为字符串。其中第一个参数 input 是必须的,其余三个参数都带有默认值。

因此,我们可以有多种调用方式:

只传必须参数,其余使用默认值

prettyPrint(Array(1, 2, 3)) shouldBe "(1,2,3)"

自定义所有参数

prettyPrint(Array(1, 2, 3), "[", ";", "]") shouldBe "[1;2;3]"

⚠️ 这样做既保持了灵活性,又避免了重复代码,是一种很常见的优雅写法

3. 命名参数

上一节中的 prettyPrint 方法有个小问题:由于大部分参数都是字符串类型,很容易搞混参数顺序,比如把 separatorstart 写反了,导致输出格式错乱。

✅ Scala 提供了命名参数机制,允许调用时显式指定参数名,让代码更清晰、更安全:

prettyPrint(Array(1, 2, 3), start = "[", separator = ";", end = "]") shouldBe "[1;2;3]"

这样一看就知道每个参数是干嘛的,代码自解释性更强

⚠️ 但要注意:未命名参数必须出现在命名参数之前,否则编译器会报错:

// ❌ 编译不通过
prettyPrint(start = "{", separator = ",", end = "}", Array(1, 2, 3))

4. 类构造器中的命名与默认参数

命名参数和默认参数最常见也最实用的场景之一,就是用在类的构造器中

在实际业务中,很多实体类都包含大量字段,其中很多字段其实有默认值或可选值。这时候使用这两个特性,代码会简洁得多。

来看一个简化版的订单类:

case class DeliveryOrder(product: String,
                         addressToDeliver: String,
                         amount: Int = 1,
                         promoCode: Option[String] = None,
                         byTime: Option[LocalDateTime] = None,
                         comments: Option[String] = None)

这个类有两个必填字段,四个可选字段。使用命名参数和默认参数,我们可以这样创建实例:

使用命名参数 + 默认值,只传关键字段

val orderWithNamedAndDefault = new DeliveryOrder(
  product = "Pho Bo",
  addressToDeliver = "42 Some Street, suite 24",
  promoCode = Some("SALE42")
)

不使用命名参数,必须按顺序传所有字段(包括默认值)

val orderWithoutNamedAndDefault = new DeliveryOrder(
  "Pho Bo",
  "42 Some Street, suite 24",
  1,
  Some("SALE42"),
  None,
  None
)

orderWithNamedAndDefault shouldBe orderWithoutNamedAndDefault

对比之下,使用命名参数的版本不仅代码更简洁,而且语义更清晰,可读性更强,尤其在参数较多时优势明显。

5. 总结

通过本文的学习,我们了解到:

  • ✅ Scala 的默认参数可以减少样板代码,提升开发效率;
  • ✅ 命名参数让方法调用更清晰,避免参数顺序错误;
  • ✅ 在类构造器中结合使用这两个特性,能显著提升代码的可读性和可维护性。

如需查看本文中所有示例的完整源码,可以访问 GitHub 项目地址


原始标题:Named and Default Arguments in Scala