복붙노트

[SCALA] 무엇 스칼라의 매니페스트이며, 당신이 그것을 할 때 필요합니까?

SCALA

무엇 스칼라의 매니페스트이며, 당신이 그것을 할 때 필요합니까?

스칼라는 2.7.2 이후 자바 타입의 삭제에 대한 해결 방법입니다 매니페스트라는 것이 있습니다. 그러나 정확히 어떻게 매니페스트 작업을 수행하는 이유 / 때 당신은 그것을 사용해야합니까?

블로그 포스트 매니페스트 : 호르헤 오티즈에 의해 구체화 유형 그것의 일부를 설명하지만, 상황에 맞는 범위와 함께 사용하는 방법에 대해 설명하지 않습니다.

또한, ClassManifest은 무엇인가, 매니페스트과의 차이점은 무엇입니까?

나는 몇 가지 코드가 삭제를 입력 할 수와 관련하여 몇 가지 경고를 가지고 그 (큰 프로그램의 일부를 쉽게 여기 포함 할 수 없습니다) 나는 매니페스트를 사용하여 이러한를 해결할 수 있습니다 생각,하지만 난 정확히 모르겠어요.

해결법

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

    1.컴파일러는 쉽게 나타낼 수있는 JVM 런타임에 비해 유형에 대한 자세한 정보를 알고있다. 매니페스트가 손실 된 유형에 대한 정보를 런타임에 코드 차원 간 메시지를 보낼 수있는 컴파일러를위한 방법입니다.

    컴파일러는 쉽게 나타낼 수있는 JVM 런타임에 비해 유형에 대한 자세한 정보를 알고있다. 매니페스트가 손실 된 유형에 대한 정보를 런타임에 코드 차원 간 메시지를 보낼 수있는 컴파일러를위한 방법입니다.

    이것은 Kleptonians 화석 기록과 인간의 '정크'DNA에 인코딩 된 메시지를 떠난 방법과 유사하다. 광속 및 중력 공명 필드의 제한으로 인해, 그들은 직접 통신 할 수 없습니다. 어떻게 자신의 신호로 조정에 알고있는 경우 그러나, 당신은 재생하는 점심이나되는 로또 번호를 무엇을 먹고 결정에서, 당신이 상상할 수없는 방법으로 혜택을 누릴 수 있습니다.

    매니페스트 (manifest) 자세한 내용을 모르고 당신이보고있는 오류를 도움이 될 경우에 명확하지 않다.

    매니페스트의 한 일반적인 사용은 다른 컬렉션의 정적 유형에 따라 코드 동작합니다을하는 것입니다. 예를 들어, 목록의 다른 유형에서 다른 목록 [문자열]을 치료하기 위해 무엇을 원하는 경우 :

     def foo[T](x: List[T])(implicit m: Manifest[T]) = {
        if (m <:< manifest[String])
          println("Hey, this list is full of strings")
        else
          println("Non-stringy list")
      }
    
      foo(List("one", "two")) // Hey, this list is full of strings
      foo(List(1, 2)) // Non-stringy list
      foo(List("one", 2)) // Non-stringy list
    

    이에 대한 반사 기반 솔루션은 아마도리스트의 각 요소를 검사 포함한다.

    바인딩 컨텍스트는 스칼라 타입 클래스를 사용하여 가장 적합한 것, 그리고 잘 Debasish 고쉬가 여기에 설명되어 있습니다 : http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html

    컨텍스트 경계는 단지 메소드 서명을 더 읽기 쉽게 만들 수 있습니다. 예를 들어, 상기 함수는 문맥과 같이 경계를 사용하여 재기록 될 수있다 :

      def foo[T: Manifest](x: List[T]) = {
        if (manifest[T] <:< manifest[String])
          println("Hey, this list is full of strings")
        else
          println("Non-stringy list")
      }
    
  2. ==============================

    2.매니페스트와 ClassManifest의 차이에 관한 아니 완벽한 대답하지만, 당신은 스칼라 2.8 배열 종이에서 예를 찾을 수 있습니다 :

    매니페스트와 ClassManifest의 차이에 관한 아니 완벽한 대답하지만, 당신은 스칼라 2.8 배열 종이에서 예를 찾을 수 있습니다 :

    예:

    def  tabulate[T](len:Int,  f:Int=>T)(implicit m:ClassManifest[T]) =  { 
      val  xs  =  new  Array[T](len) 
      for   (i  <- 0  until   len)  xs(i)   = f(i) 
      xs 
    } 
    

    (그림이 SO 질문을 참조)

    def  tabulate[T:    ClassManifest](len:Int,  f:Int=>T)  =  { 
      val  xs  =  new  Array[T](len) 
      for   (i  <- 0  until   len)  xs(i)   = f(i) 
      xs 
    } 
    
  3. ==============================

    3.매니페스트는 타입 삭제가 (제네릭을 지원하지 않는)를 JVM에서 실행할 수 일반적인 유형을 구체화하도록했다. 그들도 단순했고, 완전히 스칼라의 타입 시스템을 지원 할 수 없습니다 : 그러나, 그들은 몇 가지 심각한 문제가 있었다. 따라서 이들은 스칼라 2.10에서 사용되지 않는, 그리고 (스칼라 컴파일러 자체가 유형을 나타내는 데 사용하는, 따라서 완전히 스칼라 유형을 지원하는 것을 본질적으로) TypeTags로 대체됩니다. 차이에 대한 자세한 내용은 다음을 참조하십시오

    매니페스트는 타입 삭제가 (제네릭을 지원하지 않는)를 JVM에서 실행할 수 일반적인 유형을 구체화하도록했다. 그들도 단순했고, 완전히 스칼라의 타입 시스템을 지원 할 수 없습니다 : 그러나, 그들은 몇 가지 심각한 문제가 있었다. 따라서 이들은 스칼라 2.10에서 사용되지 않는, 그리고 (스칼라 컴파일러 자체가 유형을 나타내는 데 사용하는, 따라서 완전히 스칼라 유형을 지원하는 것을 본질적으로) TypeTags로 대체됩니다. 차이에 대한 자세한 내용은 다음을 참조하십시오

    스칼라 2.10가 출시 된 2013년 1월 4일, 전에.

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

    4.의는 스칼라 소스 (Manifest.scala)에서 매니페스트를 확인해 보자, 우리는 다음을 참조하십시오

    의는 스칼라 소스 (Manifest.scala)에서 매니페스트를 확인해 보자, 우리는 다음을 참조하십시오

    Manifest.scala:
    def manifest[T](implicit m: Manifest[T])           = m
    

    다음 예제 코드에 관해서 그래서 :

    def foo[A](somelist: List[A])(implicit m: Manifest[A]): String = {
      if (m <:< manifest[String]) {
        "its a string"
      } else {
        "its not a string"
      }
    }
    

    우리의 예시적인 코드가 [문자열]이었다 매니페스트에 제공하는 입력 파라미터를 만족 [T] 매니페스트 우리는 매니페스트 함수 암시 m 검색 것을 알 수있다. 그래서 당신은 뭔가를 호출 할 때 :

    if (m <:< manifest[String]) {
    

    당신은 당신이 당신의 기능에 정의 된 현재의 암시 m 유형 매니페스트 [문자열]의 경우 확인하고 매니페스트로 유형 매니페스트 [T]의 기능은 특정 매니페스트 [문자열]을 검색 할 것이며,이 경우 찾을 것입니다 거기 이러한 암시한다.

  5. from https://stackoverflow.com/questions/3213510/what-is-a-manifest-in-scala-and-when-do-you-need-it by cc-by-sa and MIT license