我正在开发一个 Scala API(顺便说一下,对于 Twilio),其中操作具有大量参数,其中许多具有合理的默认值。为了减少打字并提高可用性,我决定使用带有命名和默认参数的案例类。例如对于 TwiML Gather 动词:
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE, // Infinite
callbackUrl: Option[String] = None,
timeout: Int = 5
) extends Verb
这里感兴趣的参数是callbackUrl。它是唯一一个真正可选的参数,如果没有提供值,则不会应用任何值(这是完全合法的)。
我已经将它声明为一个选项,以便在 API 的实现端使用它来执行 monadic map 例程,但这会给 API 用户带来一些额外的负担:
Gather(numDigits = 4, callbackUrl = Some("http://xxx"))
// Should have been
Gather(numDigits = 4, callbackUrl = "http://xxx")
// Without the optional url, both cases are similar
Gather(numDigits = 4)
据我所知,有两种选择(没有双关语)来解决这个问题。要么让 API 客户端将隐式转换导入范围:
implicit def string2Option(s: String) : Option[String] = Some(s)
或者我可以使用 null 默认值重新声明案例类并将其转换为实现端的选项:
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE,
callbackUrl: String = null,
timeout: Int = 5
) extends Verb
我的问题如下:
- 有没有更优雅的方法来解决我的特殊情况?
- 更一般地说:命名参数是一种新的语言特性(2.8)。难道选项和命名的默认参数就像油和水一样吗?:)
- 在这种情况下,使用 null 默认值可能是最佳选择吗?