Scala - 可选参数,无需用户输入 Some(..)



我正在设计一个程序。我是 Scala 的新手,但似乎使用以下方法处理可选参数:

def f1(my_string: Option[String] = None) = {
// Maybe do some pattern matching here to extract the value
}

但是,对于最终用户来说,这是非常丑陋的,因为他们需要像这样调用此函数:

f1(Some("foo")

有没有一种技术或模式可以把它变成:

f1("foo"))

并且仍然使用可选参数?即 f1(( 也有效?

我问的原因是我显然使用了不需要添加显式 Some(..( 的 Scala 库,但在它们的源代码中,它们定义了上述函数。我个人会使用默认参数,但徘徊为什么这是一种设计模式。

一个选项是仅为此类参数创建一个帮助程序类,以避免链接线程中的anyToOption隐式转换:

class OptArg[A](val asOption: Option[A])
object OptArg {
def NoArg[A] = new OptArg[A](None)
implicit def fromValue[A](x: A): OptArg[A] = new OptArg(Some(x))
// optional
implicit def toOption[A](arg: OptArg[A]) = arg.asOption
}
// use
def f1(my_string: OptArg[String] = NoArg) = {
// can use my_string as if it was Option,
// or call my_string.asOption explicitly
}

在简单的情况下,当然重载会更合适,但如果你有很多可选参数,则不合适。

缺点是依赖于隐式转换,但我认为这是非常良性的,不太可能意外触发。

OTOH 我认为在实践中很少有参数是可选的,但"无参数"与该类型的某些默认值不对应,所以我会看看它是否可以定义为

def f1(my_string: String = something)

以避免整个问题。

而不是Option你可以重载该方法。

f1() :ReturnType = {...}
f1(arg:String) :ReturnType = {...}

调用中Option的语法开销,例如

f1(Some("foo"))

与大型代码库中空指针异常的最小风险值相比,是微不足道的。图灵奖获得者霍尔

道歉

我称之为我的十亿美元错误。这是虚空的发明 1965年参考。

最新更新