2013-01-16 5 views
5

In Scala immutable.Queue, gibt es zwei Methoden beide enqueue genannt:Wie wird Scala's Queue.enqueue (iter: Iterable [B]) aufgerufen?

/** Creates a new queue with element added at the end 
    * of the old queue. 
    * 
    * @param elem  the element to insert 
    */ 
    def enqueue[B >: A](elem: B) = new Queue(elem :: in, out) 

    /** Returns a new queue with all elements provided by an `Iterable` object 
    * added at the end of the queue. 
    * 
    * The elements are prepended in the order they are given out by the 
    * iterator. 
    * 
    * @param iter  an iterable object 
    */ 
    def enqueue[B >: A](iter: Iterable[B]) = 
    new Queue(iter.toList reverse_::: in, out) 

Ich weiß nicht, wie die Mehrdeutigkeit aufzulösen und die zweite nennen. Hier ist, was ich versucht habe:

Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_07). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import collection.immutable.Queue 
import collection.immutable.Queue 

scala> val q: Queue[Int] = Queue(1,2,3) 
q: scala.collection.immutable.Queue[Int] = Queue(1, 2, 3) 

scala> q.enqueue(Iterable(4)) 
res0: scala.collection.immutable.Queue[Any] = Queue(1, 2, 3, List(4)) 

scala> q.enqueue[Int](Iterable(4)) 
<console>:10: error: overloaded method value enqueue with alternatives: 
    (iter: scala.collection.immutable.Iterable[Int])scala.collection.immutable.Queue[Int] <and> 
    (elem: Int)scala.collection.immutable.Queue[Int] 
cannot be applied to (Iterable[Int]) 
       q.enqueue[Int](Iterable(4)) 
        ^
+1

Ich muss sagen, es sieht aus wie ein Fehler für mich, aber vielleicht gibt es etwas, das ich nicht bekomme. –

+0

@RandallSchulz IMHO, beide Dinge: Sie haben etwas vermisst, aber das ist wirklich ein Fehler. –

Antwort

8

Knifflig, knifflig!

ich created a ticket darüber. Du siehst, du wurdest von Typen irregeführt!

scala> q.enqueue(scala.collection.Iterable(4)) 
res8: scala.collection.immutable.Queue[Any] = Queue(1, 2, 3, List(4)) 

scala> q.enqueue(scala.collection.immutable.Iterable(4)) 
res9: scala.collection.immutable.Queue[Int] = Queue(1, 2, 3, 4) 

The Iterable standardmäßig importiert ist die scala.collection.Iterable, die entweder veränderbare oder unveränderlich sein können, aber die unveränderliche Warteschlange erfordert die unveränderlichenIterable statt.

+0

@DanielCSobral (Lange Zeit, Daniel!) Was wirst du im Ticket anfordern? Dokumentationserklärung? –

+1

@RandallSchulz Ich denke, dass die API geändert werden sollte. Es gibt keinen Grund, ein unveränderliches iterables zu verlangen. –

+0

Ich sehe, danke! Außerdem habe ich nicht bemerkt, dass Seq, IndexedSeq, Iterable und Traversable standardmäßig nicht unveränderbar sind. Ich nahm an, dass alles wie List, Stream und Vector unveränderlich ist. –

Verwandte Themen