Я думаю, что пока в Scala отсутствует языковая поддержка для реального типа void (пояснение ниже) «type», использование Option
, вероятно, является более чистым решением в долгосрочной перспективе. Может быть, даже для всех параметров по умолчанию.
Проблема в том, что люди, которые используют ваш API, знают, что некоторые из ваших аргументов являются значениями по умолчанию, могут также обрабатывать их как необязательные. Итак, они объявляют их как
var url: Option[String] = None
Это все красиво и чисто, и они могут просто подождать и посмотреть, получат ли они когда-нибудь какую-либо информацию для заполнения этого варианта.
Когда, наконец, вызовет ваш API с аргументом по умолчанию, они столкнутся с проблемой.
// Your API
case class Gather(url: String) { def this() = { ... } ... }
// Their code
val gather = url match {
case Some(u) => Gather(u)
case _ => Gather()
}
Я думаю, что было бы намного проще, чем сделать это
val gather = Gather(url.openOrVoid)
, где *openOrVoid
будет просто пропущено в случае None
. Но это невозможно.
Так что вам действительно следует подумать о том, кто будет использовать ваш API и как они могут его использовать. Вполне может быть, что ваши пользователи уже используют Option
для хранения всех переменных по той самой причине, что они знают, что они необязательны в конце…
Параметры по умолчанию хороши, но они также усложняют ситуацию; особенно когда вокруг уже есть тип Option
. Я думаю, что в вашем втором вопросе есть доля правды.