4

Scala 標準ライブラリで base trait のようなものを共有しない理由はありますcollection.mutable.Queueか? &メソッドは同じ署名を持っているようです。クラスがキュー コンテナーとして交換できないのはなぜですか、または何か不足していますか?collection.mutable.PriorityQueueQueueLikeenqueuedequeue

4

1 に答える 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 つしかないことがわかります。それは callenqueuedequeuです。使用できるようにしたい他のすべてのメソッド署名をコピーする必要trait QueueOps[T]があり、バリアント署名のあるものがある場合、それを行うことはできません。

于 2013-01-08T05:58:36.687 に答える