Scala 標準ライブラリで base trait のようなものを共有しない理由はありますcollection.mutable.Queue
か? &メソッドは同じ署名を持っているようです。クラスがキュー コンテナーとして交換できないのはなぜですか、または何か不足していますか?collection.mutable.PriorityQueue
QueueLike
enqueue
dequeue
質問する
371 次
1 に答える
1
おそらく、これは単なるコメントではなく、答えになるに値します...
どのバージョンの Scala を使用していますか? 2.10、2.9、2.8、および 2.7 の API ドキュメントを確認しましたが、どれもQueueLike
トレイトを持っていません。質問が、QueueLike
不変実装と可変実装の両方で共有できる共通の特性の概念に関するものである場合、問題があります。可変クラスは、含まれる型パラメーターですべて不変です。不変コレクション クラスはすべて、含まれている型パラメーターで共変です。含まれている型の値を含む API メンバーは、引数または戻り値の型のいずれであっても、不変の実装と可変の実装の両方で共有することはできません。
ラウンド 2:
package rrs.scribble
import scala.collection.mutable.{Queue, PriorityQueue}
import scala.math.Ordering
trait QueueOps[T]
{
def dequeue(): T
def enqueue(elems: T*): Unit
}
object UniQueue
{
sealed trait QSel
object PrioQ extends QSel
object PlainQ extends QSel
def apply[T : Ordering](kind: QSel): QueueOps[T] =
kind match {
case PrioQ => new PriorityQueue[T]() with QueueOps[T]
case PlainQ => new Queue[T]() with QueueOps[T]
}
}
object UQTest
{
import UniQueue._
def main(args: Array[String]) {
val prq1 = UniQueue[Int](PrioQ)
val plq1 = UniQueue[Int](PlainQ)
prq1.enqueue(1, 4, 9)
plq1.enqueue(9, 4, 1)
val prq2 = UniQueue[Int](PrioQ)
val plq2 = UniQueue[Int](PlainQ)
printf("prq1: dequeue=%d; dequeue=%d; dequeue=%d%n", prq1.dequeue, prq1.dequeue, prq1.dequeue)
printf("plq1: dequeue=%d; dequeue=%d; dequeue=%d%n", plq1.dequeue, plq1.dequeue, plq1.dequeue)
prq2.enqueue(9, 4, 1)
plq2.enqueue(1, 4, 9)
printf("prq2: dequeue=%d; dequeue=%d; dequeue=%d%n", prq2.dequeue, prq2.dequeue, prq2.dequeue)
printf("plq2: dequeue=%d; dequeue=%d; dequeue=%d%n", plq2.dequeue, plq2.dequeue, plq2.dequeue)
}
}
これを SBT で実行する:
> run
[info] Running rrs.scribble.UQTest
prq1: dequeue=9; dequeue=4; dequeue=1
plq1: dequeue=9; dequeue=4; dequeue=1
prq2: dequeue=9; dequeue=4; dequeue=1
plq2: dequeue=1; dequeue=4; dequeue=9
ただし、書かれているように、UniQueue.apply() から返された値でできることは 2 つしかないことがわかります。それは callenqueue
とdequeu
です。使用できるようにしたい他のすべてのメソッド署名をコピーする必要trait QueueOps[T]
があり、バリアント署名のあるものがある場合、それを行うことはできません。
于 2013-01-08T05:58:36.687 に答える