복붙노트

[SCALA] 왜 스칼라 보조 생성자는 다른 생성자에 단일 통화로 구성 할 수 있습니까?

SCALA

왜 스칼라 보조 생성자는 다른 생성자에 단일 통화로 구성 할 수 있습니까?

나는 기본 생성자는 클래스 항목의 독방 포인트가되는 방식으로 보조 생성자를 정의하는 장점을 볼 생각합니다. 그런데 왜 내가 이런 일을 할 수 없어?

class Wibble(foo: Int, bar: String) {
  def this(baz: List[Any]) = {
    val bazLength = baz.length
    val someText = "baz length is " ++ bazLength.toString
    this(bazLength, someText)
  }
}

그것은 어쩌면 보조 생성자는 부작용이없는 및 / 또는 조기 반환 할 수 있음을 보장하는 방법이 있나요?

해결법

  1. ==============================

    1.보조 생성자가 다른 생성자의 단일 호출보다 더 포함 할 수 있지만 자신의 첫 번째 문은 호출 말할 수 있어야합니다.

    보조 생성자가 다른 생성자의 단일 호출보다 더 포함 할 수 있지만 자신의 첫 번째 문은 호출 말할 수 있어야합니다.

    같이, 스칼라 프로그램에 채널을 설명했다. 6.7 :

    그냥 자바로, 하나는 별도의 방법으로 기본 생성자 호출하기 전에 실행되는 코드를 추출하여이 제한을 라운드 얻을 수 있습니다. 분명히 생성자에서 호출하도록 허용하기 위해 동반자 객체에이 도우미 메서드를 이동해야로서 스칼라에서 그것은 좀 더 복잡한 자바보다.

    하나는 함수에서 튜플을 반환 할 수 있지만 - -이 반환 튜플은 다음 주 생성자에 인수 목록으로 인정되지 않는 두 개의 생성자 매개 변수가 있고 더욱이, 특정 케이스는 어색하다. 보통 함수의 경우, 당신은 tupled 사용할 수 있지만, 슬프게도,이 생성자을 위해 작동하지 않습니다. 해결 방법은 다른 보조 생성자를 아직 추가하는 것입니다 :

    object Wibble {
    
      private def init(baz: List[Any]): (Int, String) = {
        val bazLength = baz.length
        val someText = "baz length is " ++ bazLength.toString
        println("init")
        (bazLength, someText)
      }
    }
    
    class Wibble(foo: Int, bar: String) {
    
      println("Wibble wobble")
    
      def this(t: (Int, String)) = {
        this(t._1, t._2)
        println("You can execute more code here")
      }
    
      def this(baz: List[Any]) = {
        this(Wibble.init(baz))
        println("You can also execute some code here")
      }
    
    }
    

    이것은 적어도 작품에, 그것은 약간 복잡 경우에도 마찬가지입니다.

    scala> val w = new Wibble(List(1, 2, 3))
    
    init
    Wibble wobble
    You can execute more code here
    You can also execute some code here
    w: Wibble = Wibble@b6e385
    

    @ sschaef 그의 주석에서 지적한 것 같이,이는 동반자 객체의 팩토리 메소드를 사용하여 단순화 할 수있다 :

    object Wobble {
    
      def apply(baz: List[Any]): Wobble = {
        val bazLength = baz.length
        val someText = "baz length is " ++ bazLength.toString
        println("init")
        new Wobble(bazLength, someText)
      }
    }
    
    class Wobble(foo: Int, bar: String) {
      println("Wobble wibble")
    }
    

    따라서 우리는 더 이상 객체를 생성하는 새로운 필요가 없습니다 :

    scala>  val w = Wobble(List(1, 2, 3))
    
    init
    Wobble wibble
    w: Wobble = Wobble@47c130
    
  2. from https://stackoverflow.com/questions/14207989/why-can-auxiliary-constructors-in-scala-only-consist-of-a-single-call-to-another by cc-by-sa and MIT license