Сохранение значений по умолчанию, когда `.tupled ()` - PullRequest
2 голосов
/ 18 марта 2020

В следующем фрагменте вы можете видеть, что строковый параметр имеет некоторое значение по умолчанию

def a(i: Int, s: String = "please autocomplete this param") = i
def b = (a _).tupled.andThen(println(_))

b(2) //compiler complains: not enough parameters

Но, как вы можете видеть, компилятор теряет эту информацию и теперь хочет, чтобы оба параметра

Wat do (дополнительные баллы, если кто-то крадется здесь бесформенно)

РЕДАКТИРОВАТЬ для потомков : нет способа сделать это

1 Ответ

4 голосов
/ 18 марта 2020

Согласно eptx

Функции не поддерживают параметры по умолчанию. Методы делают. Преобразование метода в функцию теряет значения параметров по умолчанию. (Scala 2.8.1)

Печать -Xprint:typer фаза компиляции

object Foo {
  def a(i: Int, s: String = "please autocomplete this param") = i
}

дает что-то вроде

def a(i: Int, s: String = "please autocomplete this param"): Int = i;
<synthetic> def a$default$2: String = "please autocomplete this param"

, где мы видим аргумент по умолчанию доступно как a$default$2. Таким образом, мы могли бы сделать что-то, что мы должны определенно НЕ сделать и объединить неявное преобразование с деталями, зависящими от реализации компилятора

object Foo {
  def a(i: Int, s: String = "please autocomplete this param") = i
  def b = (a _).tupled.andThen(println(_))
  implicit def xToTupleWithDefault(x: Int): (Int, String) = (x, a$default$2)
}

import Foo._
b(2)   // expands to b(xToTupleWithDefault(2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...