Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:为什么可以';我不能在构造函数中声明值吗?_Scala_Constructor_Case Class - Fatal编程技术网

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类构造函数中声明一些辅助值,但它似乎不是正确的Scala

简而言之,以下代码是正确的:

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类。将更新答案。谢谢