참조 가능한 패키지 객체

참조 가능한 패키지 객체 (Reference-able Package Objects)

패키지 객체를 값에 할당할 수 없게 만드는 제약을 없애는 실험적 언어 확장이에요. 이 확장을 켜면 a.b 같은 참조가 패키지 객체를 가리킬 때 자동으로 a.b.package로 확장됩니다.

출처: Scala 3 Reference

본문

패키지 객체의 한 가지 제약은 현재 그것들을 값에 할당할 수 없다는 거예요. 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.typea.b.package로 확장되고, 패키지 객체의 내용만 담아요. 패키지 객체 밖에 있는 패키지 a.b의 다른 것들은 담지 않아요.

이 두 요구사항 모두 역방향 호환성을 위해 필요해요. 어쨌든 패키지 객체와 평범한 객체 사이의 불규칙성을 없애는 주요 목표에는 영향을 주지 않아요.