强制选项类型函数参数的Scala语法糖
调用具有多个类型为强制选项类型函数参数的Scala语法糖,scala,syntactic-sugar,scala-option,Scala,Syntactic Sugar,Scala Option,调用具有多个类型为Option的参数,但在任何类型中都没有默认值None的函数时,是否存在一个语法限制 def func1(param1: Option[String], param2: Option[String]): String = param1.getOrElse(param2.getOrElse("none")) func1(None, None) // "none" func1(Some("value1"), Non
Option
的参数,但在任何类型中都没有默认值None
的函数时,是否存在一个语法限制
def func1(param1: Option[String],
param2: Option[String]): String =
param1.getOrElse(param2.getOrElse("none"))
func1(None, None) // "none"
func1(Some("value1"), None) // "value1"
func1(Some("value1"), Some("value2")) // "value1"
func1(None, Some("value2")) // "value2"
我希望在调用func1()
时只提供一个参数,而不向任何其他参数提供None
,从而实现“value2”
的返回值
func1(param2=Some("value2")) // not enough arguments for method
// func1: (param1: Option[String], param2: Option[String])String.
// Unspecified value parameter param1.
我无法修改原始函数。我可以用另一种功能来包装它,但首先要寻找已经可用的合成糖。只要你不能改变功能,那就不可能了。
但由于我们在scala中,您可以通过隐式转换添加一个适合您需要的方法 假设该类是在您的库中定义的:
class Foo {
def func1(param1: Option[String], param2: Option[String]): String =
param1 orElse param2 getOrElse "none"
}
您可以创建一个隐式类,该类使用正确的签名添加您自己的函数
implicit class FooOps(foo: Foo) {
def func1(param1: Option[String] = None, param2: Option[String] = None): String =
foo.func1(param1, param2)
}
现在可以根据需要调用该方法
scala> new Foo().func1()
res1: String = none
给他们两个默认参数?您还可以执行
param1.orElse(param2.getOrElse(“none”)
来扩展erip的评论:为什么不将func1
声明为def func1(param1:Option[String]=none,param2:Option[String]=none):String
?如上所述,我无法修改原始函数(这是我正在使用的库中的文件,此时不想分叉任何内容)。我可以用另一个函数来包装它,但首先要寻找已经可用的合成糖。你必须包装它。如果你可以修改库代码,这将是危险的,对吗?Aki的建议不起作用。你知道为什么吗?显然,只有当你用空参数列表调用它,或者如果你在imp中更改函数的名称,它才会起作用合法阶级