복붙노트

[SCALA] 스칼라 클래스 생성자 매개 변수

SCALA

스칼라 클래스 생성자 매개 변수

의 차이점은 무엇입니까 :

class Person(name: String, age: Int) {
  def say = "My name is " + name + ", age " + age
}

class Person(val name: String, val age: Int) { 
  def say = "My name is " + name + ", age " + age
}

나는 바르로 매개 변수를 선언하고 나중에 그 값을 변경할 수 있습니까? 예를 들어,

class Person(var name: String, var age: Int) {

  age = happyBirthday(5)

  def happyBirthday(n: Int) {
    println("happy " + n + " birthday")
    n
  }
}

해결법

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

    1.첫 번째의 경우 대답은 범위는 :

    첫 번째의 경우 대답은 범위는 :

    scala> class Person(name: String, age: Int) {
         |   def say = "My name is " + name + ", age " + age
         | }
    
    scala> val x = new Person("Hitman", 40)
    
    scala> x.name
    <console>:10: error: value name is not a member of Person
                  x.name
    

    만약 당신 접두사 매개 변수 val에, 그들은 당신이 위의 코드에서 볼 수 있듯이, 그렇지 않으면, 그들은 개인 것, 클래스의 외부에서 볼 수 VAR.

    그리고 네, 그냥 보통처럼 VAR의 값을 변경할 수 있습니다.

  2. ==============================

    2.이

    class Person(val name: String, val age: Int)
    

    클래스 예를 들어, 사용자에게 외부 필드를 사용할 수 있도록 나중에 할 수

    val p = new Person("Bob", 23)
    val n = p.name
    

    당신이 VAR로 인수를 지정하면, 그 범위 지정은 발과 동일하지만, 필드는 변경할 수 있습니다.

  3. ==============================

    3.자바에 익숙하다면,이 예에서 아이디어를 얻을 수 있습니다 :

    자바에 익숙하다면,이 예에서 아이디어를 얻을 수 있습니다 :

    class Person(name: String, age: Int)
    

    비슷하다

    class Person {
      public Person(String name, int age) {
      }
    }
    

    동안

    class Person(var name: String, var age: Int) // also we can use 'val'
    

    비슷하다

    class Person {
      String name;
      int age;
    
      public Person(String name, int age) {
         this.name = name;
         this.age = age;
      }
    }
    

    직감은 VAR / 발 않고, 변수는 생성자 내부에서만 액세스 할 것입니다. VAR / 발 추가하면 클래스는 같은 이름의 멤버 변수를해야합니다.

  4. ==============================

    4.여기에 대한 대답은하지만 내가 바이트 코드를 탐험이 하나를 폭행하고있어, 정말 좋다. 당신이 클래스에은 javap 적용 할 때, 패키지, 보호, 공공 분야 및 전달 된 클래스의 방법을 출력합니다. 나는 수업 Person.scala을 생성하고 다음 코드를 작성.

    여기에 대한 대답은하지만 내가 바이트 코드를 탐험이 하나를 폭행하고있어, 정말 좋다. 당신이 클래스에은 javap 적용 할 때, 패키지, 보호, 공공 분야 및 전달 된 클래스의 방법을 출력합니다. 나는 수업 Person.scala을 생성하고 다음 코드를 작성.

    class Person(name: String, age: Int) {
      def say = "My name is " + name + ", age " + age
    }
    
    class PersonVal(val name: String, val age: Int) {
      def say = "My name is " + name + ", age " + age
    }
    
    class PersonVar(var name: String, var age: Int) {
    
      age = happyBirthday(5)
    
      def happyBirthday(n: Int) = {
        println("happy " + n + " birthday")
        n
      }
    }
    

    scalac Person.scala와 코드를 컴파일 후에는 이름 Person.class, PersonVal.calass, PersonVar.cass 세 개의 파일을 생성합니다. 이러한 클래스 파일의 각각은 javap 실행하여 우리는 구조는 것이 얼마나 볼 수 있습니다 :

    >>javap Person.class
    Compiled from "Person.scala"
    public class Person {
      public java.lang.String say();
      public Person(java.lang.String, int);
    }
    

    이름과 나이는 단지 사용되는 내부 생성자가 될 수 있도록이 경우에는이도 발로 선언되어 있기 때문에 사람에 대한 모든 클래스 변수를 생성,도 발하지 않았다.

    >>javap PersonVal.class
    public class PersonVal {
      public java.lang.String name();
      public int age();
      public java.lang.String say();
      public PersonVal(java.lang.String, int);
    }
    

    이 경우에는 3 명 입력 생성자이 우리가하고 생성자 내부에 선언하는 멤버의 하나입니다. 우리가 값을 변경할 수 없도록 그러나 우리는 입력 생성자에 대한 세터가 없습니다.

    >>javap PersonVar.class
    public class PersonVar {
      public java.lang.String name();
      public void name_$eq(java.lang.String);
      public int age();
      public void age_$eq(int);
      public int happyBirthday(int);
      public PersonVar(java.lang.String, int);
    }
    

    그것은 PersonVal 예와 동일합니다 그러나 우리는 그 variable_ $의 EQ 방법이 경우에 값을 변경할 수 있습니다. 변수 =의 그것은 아무것도 단지 단축 버전

  5. ==============================

    5.당신은 케이스 클래스를 사용할 수 있으며,이 경우 Person 클래스는 그 변수를 클래스 외부에서 사용할 수있을 것입니다. 경우 클래스 사람 (이름 : 문자열, 연령 : INT). 예상대로 그런 다음, 다음 코드는 작동합니다. 발에 Z = 새로운 사람 ( "존", 20); z.name // 존

    당신은 케이스 클래스를 사용할 수 있으며,이 경우 Person 클래스는 그 변수를 클래스 외부에서 사용할 수있을 것입니다. 경우 클래스 사람 (이름 : 문자열, 연령 : INT). 예상대로 그런 다음, 다음 코드는 작동합니다. 발에 Z = 새로운 사람 ( "존", 20); z.name // 존

  6. ==============================

    6.은 javap를 사용하여 코드 바이트 저자의 탐구가 나에게 도움이 @Reza하여 답은이 개념을 가장 명확하게. 이 경우의 매우 구체적인 예를 인용하려면 내 생산 웹 응용 프로그램에 직면 한 시나리오 아래를 참조하시기 바랍니다 (+ 스칼라 플레이) : 스칼라의 클래스 / 특성 방법으로 매개 변수를 삽입하는 방법

    은 javap를 사용하여 코드 바이트 저자의 탐구가 나에게 도움이 @Reza하여 답은이 개념을 가장 명확하게. 이 경우의 매우 구체적인 예를 인용하려면 내 생산 웹 응용 프로그램에 직면 한 시나리오 아래를 참조하시기 바랍니다 (+ 스칼라 플레이) : 스칼라의 클래스 / 특성 방법으로 매개 변수를 삽입하는 방법

    내가 사용하지 않는 경우 발 접두사에 다음 authorizationHandler 매개 변수 주입 컴파일러는이 오류가 발생합니다 :

    class MyController needs to be abstract, since method authorizationHandler in trait AuthorizationCheck of type => controllers.authapi.AuthorizationHandler is not defined
    [error] class MyController @Inject() (authorizationHandler: AuthorizationHandler) extends Controller with AuthorizationCheck {
    [error]       ^
    [error] one error found
    

    슬프게도 오류가 나에 접두어 발입니다 정확한 문제를 파악하는 데 도움이되지 않았다.

    class MyController @Inject()(val authorizationHandler: AuthorizationHandler) extends Controller with AuthorizationCheck {
    
       def myAction = AuthenticatedAction { implicit request =>
         ...
       }
    } 
    
  7. from https://stackoverflow.com/questions/15639078/scala-class-constructor-parameters by cc-by-sa and MIT license