[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.일반적으로 당신은에 해당하는 패키지에 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.모리츠의 대답이 자리에있는 동안, 주에 하나의 추가 점은 객체가 객체가 패키지입니다. 무엇보다도, 이것은 당신이 혼합 된 상속을 사용하여 특성에서 그들을 구축 할 수 있음을 의미합니다. 모리츠의 예는 다음과 같이 기록 될 수있다
모리츠의 대답이 자리에있는 동안, 주에 하나의 추가 점은 객체가 객체가 패키지입니다. 무엇보다도, 이것은 당신이 혼합 된 상속을 사용하여 특성에서 그들을 구축 할 수 있음을 의미합니다. 모리츠의 예는 다음과 같이 기록 될 수있다
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.당신은 소스로 바로 이동하는 것보다 더 나쁜 할 수있다. :)
당신은 소스로 바로 이동하는 것보다 더 나쁜 할 수있다. :)
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.그리 스칼라 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)
from https://stackoverflow.com/questions/3400734/package-objects by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 캔 스칼라 배우가 동시에 여러 메시지를 처리? (0) | 2019.11.14 |
---|---|
[SCALA] scala.concurrent.blocking - 실제로 무엇을합니까? (0) | 2019.11.14 |
[SCALA] 스칼라에서 FORALL (0) | 2019.11.14 |
[SCALA] 몇 가지 선물을 기다리는 방법 (0) | 2019.11.14 |
[SCALA] 어떻게 RDD의 내용을 인쇄하려면? (0) | 2019.11.14 |