복붙노트

[SCALA] 스칼라에서하는 키워드 무슨 유형을 '이해

SCALA

스칼라에서하는 키워드 무슨 유형을 '이해

나는 스칼라에 새로운 오전 정말 유형의 키워드에 대해 많이 찾을 수 없습니다. 나는 다음과 같은 표현이 의미를 이해하는 것을 시도하고있다 :

type FunctorType = (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate

FunctorType 별칭의 일종이지만, 그것은 무엇을 의미 하는가?

해결법

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

    1.예, FunctorType 별칭 유형에 대한 단지 속기

    예, FunctorType 별칭 유형에 대한 단지 속기

    (LOCALDATE, HolidayCalendar, INT, 불리언) => LOCALDATE

    유형 별칭이 종종 코드 간단한의 나머지 부분을 유지하는 데 사용됩니다 : 당신은 연락 해주기 할 수

    def doSomeThing(f: FunctorType)
    

    컴파일러로 해석 될

    def doSomeThing(f: (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate)
    

    이것은 예를 들어, 단지 튜플 또는 다른 유형에 정의 된 함수 많은 사용자 정의 타입을 정의하지 않도록하는 데 도움이됩니다.

    스칼라에서 프로그래밍이 장에서 예를 들어 설명한 바와 같이 유형에 대한 몇 가지 흥미로운 사용 사례도있다.

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

    2.사실 스칼라의 타입 키워드는 짧은 이름에 복잡한 유형을 앨리어싱보다 훨씬 더 많은 일을 할 수 있습니다. 이 타입의 멤버를 소개합니다.

    사실 스칼라의 타입 키워드는 짧은 이름에 복잡한 유형을 앨리어싱보다 훨씬 더 많은 일을 할 수 있습니다. 이 타입의 멤버를 소개합니다.

    아시다시피, 클래스는 필드 회원 및 방법 멤버를 가질 수 있습니다. 음, 스칼라는 클래스 타입의 멤버를 가질 수 있습니다.

    특정 사례 유형에 좀 더 간결한 코드를 작성할 수있는 별칭을 도입, 참이다. 유형 검사를 수행 할 때 타입 시스템은 실제 유형 별칭을 대체합니다.

    하지만 당신이 뭔가를 할 수 있습니다

    trait Base {
      type T
    
      def method: T
    }
    
    class Implementation extends Base {
      type T = Int
    
      def method: T = 42
    }
    

    클래스의 다른 멤버들처럼, 형 멤버는 (은) 추상 될 수있다 (당신은 그냥 자신의 값이 실제로 무엇을 지정하지 않는 것) 구현에서 재정의 할 수 있습니다.

    당신이 제네릭으로 구현할 수있는 것들 중 많은 부분이 추상 형식의 멤버로 번역 될 수 있기 때문에 유형 위원은 제네릭의 듀얼로 볼 수 있습니다.

    그래서 그래, 그들은 앨리어싱을 위해 사용할 수 있지만 스칼라의 타입 시스템의 강력한 기능 때문에 그, 그냥이에 제한되지 않습니다.

    자세한 내용은이 훌륭한 대답을 참조하십시오 :

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

    3.그냥 예는 별칭으로 "유형을"사용하는 방법을 볼 수 있습니다 :

    그냥 예는 별칭으로 "유형을"사용하는 방법을 볼 수 있습니다 :

    type Action = () => Unit
    

    정의하는 액션 위의 정의는 빈 매개 변수 목록과 돌려 단위를 취할 절차 (방법)의 종류의 별칭이 될 수 있습니다.

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

    4.나는 그가 타입 별칭의 매우 간단한 사용 사례를 설명하고, 자세한 내용을 위해 아주 좋은 자습서를 도입하기 때문에 롤랜드에 발트에서 답을 좋아했다. 또 다른 사용 사례가 형식 멤버 이름이 게시물에 도입되어 있기 때문에, 내가 매우 좋아 그것의 대부분의 실제 사용 사례를 언급하고 싶습니다 : (이 부분은 여기에서 가져온 것입니다 :)

    나는 그가 타입 별칭의 매우 간단한 사용 사례를 설명하고, 자세한 내용을 위해 아주 좋은 자습서를 도입하기 때문에 롤랜드에 발트에서 답을 좋아했다. 또 다른 사용 사례가 형식 멤버 이름이 게시물에 도입되어 있기 때문에, 내가 매우 좋아 그것의 대부분의 실제 사용 사례를 언급하고 싶습니다 : (이 부분은 여기에서 가져온 것입니다 :)

    추상 유형 :

    type T
    

    T 위에서 사용하는 것입니다 이러한 유형은 아직 알 수없는, 그리고 구체적인 서브 클래스에 따라,이 정의 될 것이라고 말했다. 가장 좋은 방법은 항상 프로그래밍 개념을 이해하기위한 예를 제공하고 있습니다 : 다음과 같은 시나리오를 가정 해 봅시다 :

    (가) 클래스 동물의 방법을 먹고 오버라이드 (override)하지 않는 클래스 암소와 호랑이의 방법을 먹을 수 있기 때문에 자신의 매개 변수 유형이 다르기 때문에 여기에서, 컴파일 오류가 발생합니다. 그것은 슈퍼 클래스는 클래스 동물에서 음식 대 클래스 타이거 클래스 암소 잔디, 고기의 모든 서브 클래스 준수해야합니다.

    이제 다시 다음 그림으로, 추상화를 입력하고 단순히 유형의 추상화를 추가, 당신은 하위 클래스 자체에 따라에, 입력의 유형을 정의 할 수 있습니다.

    이제 다음과 같은 코드를 보면 :

      val cow1: Cow = new Cow
      val cow2: Cow = new Cow
    
      cow1 eat new cow1.SuitableFood
      cow2 eat new cow1.SuitableFood
    
      val tiger: Tiger = new Tiger
      cow1 eat new tiger.SuitableFood // Compiler error
    

    컴파일러는 행복이며 우리는 우리의 디자인을 개선. 우리는 cow.SuitableFood 우리의 소를 먹을 수 및 컴파일러는 타이거에 적합한 음식과 함께 소를 먹이로 우리를 방지 할 수 있습니다. 그러나 우리는 cow1 SuitableFood 및 cow2 SuitabeFood의 종류의 차이를 만들기 위해 무엇을하려는 경우. 경로가있는 우리는 (객체를 통해 물론) 유형에 도달 기본적으로 문제가 않는 경우 다른 단어에서, 일부 시나리오에서 매우 유용 할 것이다. 스칼라의 고급 기능 덕분에, 그것은 가능하다 :

    경로 의존적 유형 : 스칼라 객체는 회원으로 유형을 가질 수 있습니다. 유형의 의미는, 당신이 그것을 액세스하는 데 사용하는 경로에 따라 달라집니다. 경로는 물체 (일명 클래스의 인스턴스)에 대한 기준에 의해 결정된다. 이 시나리오를 구현하기 위해, 당신은 암소 내부 클래스 잔디를 정의 할 필요가있다, 즉, 암소는 외부 클래스와 잔디는 내부 클래스입니다. 구조는 다음과 같이 될 것입니다 :

      class Cow extends Animal {
        class Grass extends Food
        type SuitableFood = Grass
        override def eat(food: this.SuitableFood): Unit = {}
      }
    
      class Tiger extends Animal {
        class Meat extends Food
        type SuitableFood = Meat
        override def eat(food: this.SuitableFood): Unit = {}
      }
    

    이제이 코드를 컴파일하려고하면 :

      1. val cow1: Cow = new Cow
      2. val cow2: Cow = new Cow
    
      3. cow1 eat new cow1.SuitableFood
      4. cow2 eat new cow1.SuitableFood // compilation error
    

    잔디 따라서, 지금 암소의 내부 클래스이기 때문에 라인 4에 당신이 잔디의 인스턴스를 생성, 오류가 표시됩니다, 우리는 소 개체를 필요로하고,이 소 개체는 경로를 결정합니다. 2 그래서 소 개체는 2 개의 다른 경로에 상승을 제공합니다. 이 시나리오에서는 cow2는 특히 그것을 만든 음식을 먹고 싶어. 그래서:

    cow2 eat new cow2.SuitableFood
    

    이제 모두가 행복 :-)

  5. from https://stackoverflow.com/questions/19492542/understanding-what-type-keyword-does-in-scala by cc-by-sa and MIT license