强制选项类型函数参数的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中更改函数的名称,它才会起作用合法阶级