【发布时间】:2011-05-11 02:35:12
【问题描述】:
我正在开发一个 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)。难道选项和命名的默认参数就像油和水一样吗? :)
- 在这种情况下,使用空默认值可能是最佳选择吗?
【问题讨论】:
-
感谢您为问题 1 和 3 提供了很多好的答案!在决定是使用 Aaron 的 Opt、坚持使用 Option 还是仅使用 null 默认值之前,我将实现更多 API 使用示例用例。可惜没有明显的选择——也许我们需要一个新的语言特性来让选择变得不费脑筋?
标签: scala optional-parameters named-parameters