Первый параметр по умолчанию в Scala - PullRequest
3 голосов
/ 26 апреля 2011

Есть ли другой способ сделать эту работу?

def b(first:String="hello",second:String) = println("first:"+first+" second:"+second)

b(second="geo")

Если я вызываю метод просто:

b("geo")

Я получаю:

<console>:7: error: not enough arguments for method b: (first: String,second: String)Unit.
Unspecified value parameter second.
       b("geo")

Ответы [ 3 ]

5 голосов
/ 26 апреля 2011

Вот один из возможных способов: вы можете использовать несколько списков аргументов и карри:

scala> def b(first:String="hello")(second:String) = println("first:"+first+" second:"+second)
b: (first: String)(second: String)Unit

scala> b()("Scala")
first:hello second:Scala

scala> val c = b() _
c: (String) => Unit = <function1>

scala> c("Scala")
first:hello second:Scala
3 голосов
/ 26 апреля 2011

См. Спецификации языка Scala 6.6.1 (http://www.scala -lang.org / document / files / ScalaReference.pdf):

"Именованные аргументы образуют суффикс списка аргументов e1, ..., em, т.е. ни один позиционный аргумент не следует за именованным."

2 голосов
/ 26 апреля 2011

Предоставление единственного строкового параметра (без присвоения ему имени) слишком неоднозначно для компилятора. Вероятно, Вы имели в виду значение для параметра не по умолчанию, но ... возможно, нет.Поэтому компилятор хочет, чтобы вы были более конкретны.

Как правило, все параметры по умолчанию помещаются в конец сигнатуры метода (если вы это сделали, b("geo") будет работать), чтобы их можно было оставитьменее двусмысленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...