一般的に、Scalaのパッケージでこれを行うことはできません。通常、あなたが希望だけローカルファイル内のパッケージ別名:
import scala.{ math => physics }
scala> physics.min(1, 2)
res6: Int = 1
しかし、これはあなたが聞いて何をしません。パッケージ自体は値または型ではないため、パッケージ自体として割り当てることはできません。これらは失敗します:
type physics = scala.math
val physics = scala.math
パッケージオブジェクトを使用すると、その中のクラスではなく、具体的なメンバーを取得できます。たとえば、次のように
scala> val physics = scala.math.`package`
physics: math.type = [email protected]
scala> physics.min(1, 2)
res0: Int = 1
しかし、従来のパッケージに属するオブジェクトや種類は動作しません使用して:
scala> scala.math.BigDecimal(1)
res1: scala.math.BigDecimal = 1
scala> physics.BigDecimal(1)
<console>:13: error: value BigDecimal is not a member of object scala.math.package
physics.BigDecimal(1)
^
オクラホマので、あなたが何をすべき?
これを検討している理由は、使用しているライブラリの実装を隠しておき、後で簡単に置き換えることができるからです。その場合、別のインタフェースまたはオブジェクト(ファサード)内のライブラリを非表示にする必要があります。これは、ライブラリ内に含まれるすべてのメソッドと値を転送する必要があるわけではなく、実際に使用しているメソッドと値のみを転送する必要があるということではありません。このようにして、別のライブラリに移行する場合は、コードの残りの部分だけがファサードを参照するため、クラスを1つ変更する必要があります。例えば
、我々はscala.math
からmin
とmax
を使用していたが、後に、より効率的なソリューションを提供して別のライブラリに置き換えることを望んでいた場合(そのようなものが存在する場合)、私たちはこのようなファサードを作成することができます。
scala.math
が交換されたとき、彼らは同じままことができるように
object Math {
def min(x: Int, y: Int): Int = scala.math.min(x, y)
def max(x: Int, y: Int): Int = scala.math.max(x, y)
}
他のすべてのクラスは、Math.min
とMath.max
を使用します。 Math
を特性(実装)から除外し、サブクラスまたはオブジェクト(たとえばScalaMath
)に実装を提供して、クラスが異なる実装を注入できるようにすることもできます。あなたはパッケージオブジェクトで実装に移行したときにクライアントが壊れていないになるだろう
package object p { def f = 42 }
package q {
object `package` { def f = p.f }
}
/*
package object q {
val `package` = p.`package`
}
*/
package client {
import q.`package`._
object Test extends App {
println(f)
}
}
:
これは私の脳が合成できなかったパッケージオブジェクトのライブラリとエイリアシングをフォークする中間点です。少し退屈ですが、それは私により多くの制御を与える、ありがとう! –