【问题标题】:Scala syntactic sugar for mandatory Option-type function parameters强制选项类型函数参数的 Scala 语法糖
【发布时间】:2019-05-07 06:09:40
【问题描述】:

是否存在语法糖来调用具有多个 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.

我无法修改原始功能。我可以用另一个函数包装它,但首先要寻找已经可用的语法糖。

【问题讨论】:

  • 给他们两个默认参数?你也可以param1.orElse(param2).getOrElse("none")
  • 稍微扩展一下erip的评论:为什么不把func1声明为def func1(param1: Option[String] = None, param2: Option[String] = None): String?
  • 如前所述,我无法修改原始函数(它来自我正在使用的库,此时不想分叉任何东西)。我可以用另一个函数包装它,但首先要寻找已经可用的语法糖。
  • 你必须把它包起来。如果你可以修改库代码,那会很危险,对吧?

标签: scala syntactic-sugar scala-option


【解决方案1】:

只要你不能改变功能,那应该是不可能的。
但是由于我们在 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

【讨论】:

猜你喜欢
  • 2014-08-10
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2013-07-05
  • 1970-01-01
  • 2018-07-08
  • 2017-05-05
相关资源
最近更新 更多