Scala:如何使用非简单的默认值?
Scala: How to use non-simple default values?
我是 scala 的新手,我有一个 class 通常只需要使用非默认值初始化少量变量(有时 none)。最初我使用构建器 class 来执行此操作,但后来意识到在构造器中使用 scala 的默认值可以更好地完成此操作。问题是一些默认值比 String = "name"
或 Int = 1
等稍微复杂一点,需要实际代码,如
val name: String = "Party-" + LocalDateTime.now.atZone(ZoneId.systemDefault()).toEpochSecond
好吧,这看起来很糟糕,但它将满足该变量的唯一名称要求并且它有效。
我还有其他需要格式化日期的变量,默认值需要从今天开始,满足:
private val now: LocalDateTime = LocalDateTime.now()
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
private var startDate = dateFormat.format(now)
private var startHour = now.getHour
所以显然我不能将所有代码用作 startDate
的默认值我不能对这两个变量使用一行,因为它们共享一个先前初始化的变量,那么我应该如何实现它?
谢谢!
不要使用 var
用默认值初始化某些东西。通常不鼓励可变性。
最好在 "real" 值上使用 Option
,如果 "real" 值不可用,则执行 getOrElse
以回退到默认值。 getOrElse
的参数可以是一个块,像这样:
myReal.getOrElse {
val now: LocalDateTime = LocalDateTime.now()
val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
dateFormat.format(now)
}
我觉得你看错了。 Scala 是一种强类型语言。所以最好的做法是将所有东西都用作一个类型,所以只需创建一个案例 class。对于您在长字符串中的示例。创建一个 PartyEpoc,在这种情况下 class ctor - 默认情况下具有此值,否则将初始化为其他内容
不确定这是否适合您的用例,但是惰性值会解决您的问题吗?
private val now: LocalDateTime = LocalDateTime.now()
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
private lazy val startDate = dateFormat.format(now)
private lazy val startHour = now.getHour
那么只需要在对象构造时初始化now
,其他变量在第一次使用时会正确初始化。
我是 scala 的新手,我有一个 class 通常只需要使用非默认值初始化少量变量(有时 none)。最初我使用构建器 class 来执行此操作,但后来意识到在构造器中使用 scala 的默认值可以更好地完成此操作。问题是一些默认值比 String = "name"
或 Int = 1
等稍微复杂一点,需要实际代码,如
val name: String = "Party-" + LocalDateTime.now.atZone(ZoneId.systemDefault()).toEpochSecond
好吧,这看起来很糟糕,但它将满足该变量的唯一名称要求并且它有效。
我还有其他需要格式化日期的变量,默认值需要从今天开始,满足:
private val now: LocalDateTime = LocalDateTime.now()
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
private var startDate = dateFormat.format(now)
private var startHour = now.getHour
所以显然我不能将所有代码用作 的默认值我不能对这两个变量使用一行,因为它们共享一个先前初始化的变量,那么我应该如何实现它?startDate
谢谢!
不要使用 var
用默认值初始化某些东西。通常不鼓励可变性。
最好在 "real" 值上使用 Option
,如果 "real" 值不可用,则执行 getOrElse
以回退到默认值。 getOrElse
的参数可以是一个块,像这样:
myReal.getOrElse {
val now: LocalDateTime = LocalDateTime.now()
val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
dateFormat.format(now)
}
我觉得你看错了。 Scala 是一种强类型语言。所以最好的做法是将所有东西都用作一个类型,所以只需创建一个案例 class。对于您在长字符串中的示例。创建一个 PartyEpoc,在这种情况下 class ctor - 默认情况下具有此值,否则将初始化为其他内容
不确定这是否适合您的用例,但是惰性值会解决您的问题吗?
private val now: LocalDateTime = LocalDateTime.now()
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
private lazy val startDate = dateFormat.format(now)
private lazy val startHour = now.getHour
那么只需要在对象构造时初始化now
,其他变量在第一次使用时会正确初始化。