Синтаксический сахар Scala для обязательных параметров функции типа Option - PullRequest
0 голосов
/ 05 декабря 2018

Существует ли синтетический сахар для вызова функции с несколькими параметрами типа 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"

Я хотел бы получить возвращаемое значение "value2", давая только один параметр при вызове func1(), но не передавая None другим.

func1(param2=Some("value2"))  // not enough arguments for method 
                              //  func1: (param1: Option[String], param2: Option[String])String.
                              //  Unspecified value parameter param1.

Я не могу изменить исходную функцию.Я мог бы обернуть его другой функцией, но сначала поискать уже имеющиеся синтетические сахара.

1 Ответ

0 голосов
/ 05 декабря 2018

Пока вы не можете изменить функцию, это не должно быть возможно.
Но так как мы находимся в 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
...