Scala:为什么可以';我不能在构造函数中声明值吗?
我想在case类构造函数中声明一些辅助值,但它似乎不是正确的Scala 简而言之,以下代码是正确的:Scala:为什么可以';我不能在构造函数中声明值吗?,scala,constructor,case-class,Scala,Constructor,Case Class,我想在case类构造函数中声明一些辅助值,但它似乎不是正确的Scala 简而言之,以下代码是正确的: case class Something( text1: String, text2: String ) { def this(datetime: LocalDateTime) { this( s"date: ${datetime.toLocalDate.toString()}", s"time: ${dat
case class Something(
text1: String,
text2: String
) {
def this(datetime: LocalDateTime) {
this(
s"date: ${datetime.toLocalDate.toString()}",
s"time: ${datetime.toLocalTime.toString()}"
)
}
}
以下情况并非如此:
case class Something(
text1: String,
text2: String
) {
def this(datetime: LocalDateTime) {
val date = datetime.toLocalDate.toString()
val time = datetime.toLocalTime.toString()
this(
s"date: $date",
s"time: $time"
)
}
}
即使后者更容易辨认和维护。(想象一下使用比只调用两个方法更复杂的操作。)这是为什么
有没有其他方法可以编写这样的构造函数或解决此问题的方法?辅助构造函数有一个约束,即它应该在其主体的第一行调用以前的辅助构造函数或主构造函数。第二个代码不遵循该规则。因此出现了错误。辅助构造函数有一个约束,即它应该在其主体的第一行调用前一个辅助构造函数或主构造函数。第二个代码不遵循该规则。因此出现了错误。在第二种情况下,在调用
此(params)
之前,不允许在构造函数中定义变量,如下所示解决此问题的一种方法是传递内联构造函数参数。
test("test case class custom constructor") {
case class Something(text1: String,text2: String) {
def this(datetime: LocalDateTime) {
this(datetime.toLocalDate.toString(), datetime.toLocalTime.toString())
//you can do whatever you want after this(x, y) is invoked
val testVal = "apple"
println(testVal)
}
}
new Something(LocalDateTime.now()).text1 shouldBe "2017-07-16"
new Something(LocalDateTime.now()).text2 should not be empty
}
另一种方法()是定义case类,然后定义在伴生对象内部应用
,如下所示(对于较旧的版本,可能是2.11.8
,伴生对象必须首先定义,并且是唯一一个现在似乎已修复的case类-)
scastie code-在第二种情况下,在调用
此(参数)
之前,不允许在构造函数中定义变量,如所示解决此问题的一种方法是传递内联构造函数参数。
test("test case class custom constructor") {
case class Something(text1: String,text2: String) {
def this(datetime: LocalDateTime) {
this(datetime.toLocalDate.toString(), datetime.toLocalTime.toString())
//you can do whatever you want after this(x, y) is invoked
val testVal = "apple"
println(testVal)
}
}
new Something(LocalDateTime.now()).text1 shouldBe "2017-07-16"
new Something(LocalDateTime.now()).text2 should not be empty
}
另一种方法()是定义case类,然后定义在伴生对象内部应用
,如下所示(对于较旧的版本,可能是2.11.8
,伴生对象必须首先定义,并且是唯一一个现在似乎已修复的case类-)
scastie代码-在Scala中,第一次调用必须是主构造函数。在此之后,您可以拥有任意数量的代码。阅读以获得解释 类似的规则适用于Java中的this和super。但不完全一样。阅读 this和super必须放在第一位的原因是,在调用实际this(x,y)之前,可以将字段设置为各种值。这意味着正在构造对象,并且在构造过程中可能引用该对象的任何线程都可以看到不同的值
谢谢。在Scala中,第一个调用必须是主构造函数。在此之后,您可以拥有任意数量的代码。阅读以获得解释 类似的规则适用于Java中的this和super。但不完全一样。阅读 this和super必须放在第一位的原因是,在调用实际this(x,y)之前,可以将字段设置为各种值。这意味着正在构造对象,并且在构造过程中可能引用该对象的任何线程都可以看到不同的值
谢谢。@M.M.所有的
案例类
都已经有了它们的伴生对象。你试过了吗?你也会说同样的错误。好吧,我做了,我没有得到任何错误…哦,是的,你是对的,使用scala2.12
-。至少在一些版本2.11中,我必须首先定义伴生对象,然后定义case类。将更新答案。Thanks@M.M.所有的案例类
都已经有了它们的伴生对象。你试过了吗?你也会说同样的错误。好吧,我做了,我没有得到任何错误…哦,是的,你是对的,使用scala2.12
-。至少在一些版本2.11中,我必须首先定义伴生对象,然后定义case类。将更新答案。谢谢