복붙노트

[SCALA] 패키지 오브젝트

SCALA

패키지 오브젝트

패키지 개체, 순전히 개념하지만 사용법은 무엇입니까?

나는 예를 들어 작업을 얻기 위해 노력했습니다과는 일이 아니라 다음과되었다에 내가 가진 형성 :

package object investigations {
    val PackageObjectVal = "A package object val"
}

package investigations {

    object PackageObjectTest {
        def main(args: Array[String]) {
            println("Referencing a package object val: " + PackageObjectVal)
        }
    }
}

지금까지했습니다 관찰은 다음과 같습니다 :

package object _root_ { ... }

(합리적이다) 허용되고

package object x.y { ... }

또한 허용되지 않습니다.

중괄호로 구분 된 패키지 신고서가 필요 이상으로 작성하는 경우 패키지 오브젝트가, 바로 위 부모 패키지로 선언되어야 함을 보인다.

그들은 일반적으로 사용 있습니까? 그렇다면, 어떻게?

해결법

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

    1.일반적으로 당신은에 해당하는 패키지에 package.scala라는 별도의 파일에 패키지 개체를 넣어 것입니다. 또한 중첩 된 패키지 구문을 사용할 수 있습니다 그러나 그것은 매우 이례적인 일이다.

    일반적으로 당신은에 해당하는 패키지에 package.scala라는 별도의 파일에 패키지 개체를 넣어 것입니다. 또한 중첩 된 패키지 구문을 사용할 수 있습니다 그러나 그것은 매우 이례적인 일이다.

    패키지에 의해 정의 된 API를 사용할 때 패키지 내부뿐만 아니라 패키지 외부의 다양한 장소에서 정의를 필요로 할 때 패키지 개체에 대한 주요 사용 사례입니다. 다음은 그 예이다 :

    // file: foo/bar/package.scala
    
    package foo
    
    package object bar {
    
      // package wide constants:
      def BarVersionString = "1.0"
    
      // or type aliases
      type StringMap[+T] = Map[String,T]
    
      // can be used to emulate a package wide import
      // especially useful when wrapping a Java API
      type DateTime = org.joda.time.DateTime
    
      type JList[T] = java.util.List[T]
    
      // Define implicits needed to effectively use your API:
      implicit def a2b(a: A): B = // ...
    
    }
    

    이제 패키지 개체 내부의 정의는 전체 패키지 foo.bar 내부 사용할 수 있습니다. 또한 정의를 가져받을 때 패키지 수입 foo.bar._의 누군가 외부.

    당신은 방지 할 수 있습니다이 방법은 효과적으로 라이브러리를 사용하기 위해 추가 수입을 발행하기 위해 API 클라이언트를 필요로합니다 - 예를 스칼라 스윙에 당신은 쓸 필요가

    import swing._
    import Swing._
    

    onEDT 및 치수에 Tuple2에서 암시 적 변환과 같은 모든 선 (善)을 가지고있다.

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

    2.모리츠의 대답이 자리에있는 동안, 주에 하나의 추가 점은 객체가 객체가 패키지입니다. 무엇보다도, 이것은 당신이 혼합 된 상속을 사용하여 특성에서 그들을 구축 할 수 있음을 의미합니다. 모리츠의 예는 다음과 같이 기록 될 수있다

    모리츠의 대답이 자리에있는 동안, 주에 하나의 추가 점은 객체가 객체가 패키지입니다. 무엇보다도, 이것은 당신이 혼합 된 상속을 사용하여 특성에서 그들을 구축 할 수 있음을 의미합니다. 모리츠의 예는 다음과 같이 기록 될 수있다

    package object bar extends Versioning 
                              with JodaAliases 
                              with JavaAliases {
    
      // package wide constants:
      override val version = "1.0"
    
      // or type aliases
      type StringMap[+T] = Map[String,T]
    
      // Define implicits needed to effectively use your API:
      implicit def a2b(a: A): B = // ...
    
    }
    

    다음 버전은 JodaAliases 및 JavaAliases 편리 유형의 별명이 포함 콘크리트 특성 동안 패키지 오브젝트하는 "버전"방법을 가지고 있어야라는 추상적 인 특성이다. 이러한 특성은 모두 다양한 패키지 개체를 재사용 할 수 있습니다.

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

    3.당신은 소스로 바로 이동하는 것보다 더 나쁜 할 수있다. :)

    당신은 소스로 바로 이동하는 것보다 더 나쁜 할 수있다. :)

    https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/library/scala/package.scala

    https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/library/scala/collection/immutable/package.scala

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

    4.그리 스칼라 3, 여기에서와 같이, 도티에 따라, 중간-2020 출시 예정 :

    그리 스칼라 3, 여기에서와 같이, 도티에 따라, 중간-2020 출시 예정 :

    package p 
    
    type Labelled[T] = (String, T) 
    val a: Labelled[Int] = ("count", 1) 
    def b = a._2 
    def hello(name: String) = println(i"hello, $name)
    
  5. from https://stackoverflow.com/questions/3400734/package-objects by cc-by-sa and MIT license