gpt4 book ai didi

Scala:如何使用默认值初始化对象

转载 作者:行者123 更新时间:2023-12-03 21:40:05 25 4
gpt4 key购买 nike

我认为这会用一个例子更好地解释

我有以下案例类

case class Person(name: String = "no name", surname: String = "no surname")

而且我想创建一个通用函数来填充它,例如,可能未指定所有字段的 json 消息

我知道要使用默认值,简单的答案是不要将它们传递给构造函数,但是如果我有几个字段可能会或可能不会出现在 json 中,我应该使用一个巨大的 switch 语句来覆盖所有可能的组合缺少参数。在这种情况下,在阅读json之后,我应该注意姓名和姓氏的存在,没有名字,没有姓氏和没有名字和姓氏的情况......(哎呀,我希望我说清楚了)。

更准确地说,我正在尝试开发一个函数,允许我从以下 json 值创建一个人,当缺少某些参数时使用默认值
{ "name": "john", "surname": "doe" }
{ "surname": "doe" }
{ "name": "john" }
{ }

这就是为什么我正在寻找一种更通用的方法来处理这个问题。

(我将展示一些伪代码来给出我想要实现的目标)

我在想这样的事情:
val p = Person(name= "new person name", surname= Unit)

在这种情况下,姓应该获得默认值

或者类似的东西
val p = Person( Map( "name" -> "new person name" ) _* )

以便它也采用姓氏的默认值

或者也许在构造函数中这样做,如果我检测到空值(或无),我可以分配默认值。

事实上,我试图避免重复默认值的定义。

无论如何,实现这一目标的最惯用的方法是什么?

最佳答案

如果您希望使用默认值,通常只需省略该命名参数:

scala> val p = Person(name = "new person name")
p: Person = Person(new person name,no surname)

但是,由于您想明确知道一个值是否应该被默认,您可以在构造函数中实现您的基于 Map 的想法。如果您不想重复默认值,那么这两个选项如何:

选项 1:默认值的外部化常量

在外部设置默认值。在主构造函数和基于 Map 的构造函数中使用它们。
val nameDefault = "no name"
val surnameDefault = "no surname"

case class Person(name: String = nameDefault, surname: String = surnameDefault) {
def this(m: Map[String, String]) =
this(m.getOrElse("name", nameDefault), m.getOrElse("surname", surnameDefault))
}

用法:
new Person(name = "new person name", surname = "new person surname")
new Person(Map("name" -> "new person name"))
new Person(name = "new person name")

选项 2:可选的替代构造函数

您可能会发现这更简洁一些,因为它不依赖于外部常量。这里唯一的缺点是,如果您只想使用部分参数进行构造,则必须将每个参数都包裹在 Some() 中。 .
case class Person(name: String, surname: String) {
def this(name: Option[String] = None, surname: Option[String] = None) =
this(name.getOrElse("no name"), surname.getOrElse("no surname"))

def this(m: Map[String, String]) = this(m.get("name"), m.get("surname"))
}

用法:
new Person(name = "new person name", surname = "new person surname")
new Person(Map("name" -> "new person name"))
new Person(name = Some("new person name"))
new Person(name = "new person name") // can't do this

关于Scala:如何使用默认值初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10472758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com