참조 가능한 패키지 객체
참조 가능한 패키지 객체 (Reference-able Package Objects)
패키지 객체를 값에 할당할 수 없게 만드는 제약을 없애는 실험적 언어 확장이에요. 이 확장을 켜면 a.b 같은 참조가 패키지 객체를 가리킬 때 자동으로 a.b.package로 확장됩니다.
본문
패키지 객체의 한 가지 제약은 현재 그것들을 값에 할당할 수 없다는 거예요. b가 패키지 객체일 때 a.b는 컴파일에 실패해요. b가 평범한 객체일 때는 성공하는데도 말이죠. 해결 방법은 다음을 호출하는 것이에요:
a.b.`package`
하지만 이건 지저분하고 명확하지 않아요. 아니면 평범한 객체를 쓸 수도 있는데, 항상 가능한 건 아니에요.
packageObjectValues 언어 확장은 이 제약을 없애요. 확장은 언어 import import scala.language.experimental.packageObjectValues 또는 커맨드라인 옵션 -language:experimental.packageObjectValues로 활성화돼요.
이 확장은 다음을 유효한 코드로 바꿔줘요:
package a
package object b
val z = a.b // Currently fails with "package is not a value"
현재 해결 방법은 .package 접미사를 쓰는 것이에요:
val z = a.b.`package`
확장을 쓰면, b가 패키지 객체를 담은 패키지일 때 a.b 같은 참조가 자동으로 a.b.package로 확장됩니다.
제약 (Limitations)
a.b는 "단독으로" 사용될 때만 a.b.package로 확장돼요. 즉 더 큰 선택 체인 a.b.c나 그에 해당하는 후위 표현식 a.b c, 전위 표현식 !a.b, 중위 표현식 a.b c d의 일부로 사용될 때는 확장되지 않아요.
a.b는 타입 a.b.package.type의 a.b.package로 확장되고, 패키지 객체의 내용만 담아요. 패키지 객체 밖에 있는 패키지 a.b의 다른 것들은 담지 않아요.
이 두 요구사항 모두 역방향 호환성을 위해 필요해요. 어쨌든 패키지 객체와 평범한 객체 사이의 불규칙성을 없애는 주요 목표에는 영향을 주지 않아요.