2013-06-24 23 views
5

Ben hashmaps için toArray tanımı bakıyordu:Scaladoc neden HashMap.toArray Array [(A, B)] yerine Array [A] döndürdüğünü söylüyor?

http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.HashMap

It has

toArray: Array[A] 
def toArray[B >: (A, B)](implicit arg0: ClassTag[B]): Array[B] 

Oldukça bu anlamıyorum - ilk bit Eğer bir Array olsun diyor [A] ama ikinci bölüm Array [B] aldığını söylüyor? Bunların hiçbiri beklediğim nelerdir - Dizi [(A, B)]

kendim kontrol ettiğinizde:

scala> val x = scala.collection.mutable.HashMap[String, Int]() 
x: scala.collection.mutable.HashMap[String,Int] = Map() 

scala> x.put("8", 7) 
res0: Option[Int] = None 

scala> x foreach println 
(8,7) 

scala> x.toArray 
res2: Array[(String, Int)] = Array((8,7)) 

neden ToList gibi değil mi?

toList: scala.List[(A, B)] 
+0

'ın tüm iki örneğini deşifre etmekte başarısız oldu. – Austin

cevap

5

Scaladoc her türlü ince hataya sahiptir. Buradaki problem, yöntem imzasının "basitleştirilmiş" versiyonunu görmenizdir (imzanın gerekli kısmını aktarmanın bir yolu olarak ifade edilir ve CanBuildFrom gibi map/flatMap yöntemlerinde saklı tutulur, bunlar gerçekten bir uygulama detayıdır). Sadeleştirme biraz çığlık attı ve çok anlamlı görünmüyor. Aslında

def toArray[B >: (A, B)](implicit arg0: ClassTag[B]): Array[B] 

bu hala yanlış biz kesinlikle bir tür B olamaz gibi durumlarda B>,: ("tam imza" tıklarsanız gibi bağlantı, gerçek imza görünüyor göreceksiniz A, B). Bu daha fazla olmalı gibi:

def toArray[C >: (A, B)](implicit arg0: ClassTag[C]): Array[C] 

sorun aslında iki B s olmasıdır: diğeri tabanında tanımlanan yöntem toArray gelen ise ilk HashMap sınıf bildirimi (HashMap[A, +B]) gelir TraversableOnce (def toArray[B >: A](implicit arg0: ClassTag[B]): Array[B]). Sadece, scaladoc jeneratörü, B

2

Eğer toArray ait Scaladoc gördüğünüz API: değişken B gerçekten talihsiz

def toArray[C >: (A, B)](implicit arg0: ClassTag[C]): Array[C] 

tipinin seçimi (ve belki de:

def toArray[B >: (A, B)](implicit arg0: ClassTag[B]): Array[B] 

denk mi bir Scaladoc hatası, bunu yazmanıza izin verilip verilmediğinden emin değilim).

Temelde bir ClassTag mevcut olduğu (A,B)en belirgin süpertipe dizisini almak anlamına gelir. Array oluşturmak için ClassTag gereklidir.

Temel olarak, derleme zamanında, dönüştürdüğünüz Map çalışma zamanı türü tam olarak biliniyorsa, Array[(A,B)] alırsınız. Ancak, Map'u bir yere yerleştirdiyseniz, ortaya çıkan Array çalışma zamanı türü, çalışma zamanı türüne göre değil, döküm türüne bağlı olacaktır. Bu , toList'dan farklı bir davranış olup ve JVM'lerin yerel dizilerin nasıl oluşturulacağına ilişkin kısıtlamaları nedeniyle farklıdır. Koleksiyonun tip A ve dönüş değeri B nerede o TraversableOnce dan toArray, devralır çünkü

1

Scaladoc çok yanlış. Array[A] olayı üzerinden TraversableOnce geçişi olup olmadığıdır (bu durumda, A ve B farklı bir tanımı için aslında (A,B)); ve (A,B) uzun formda düzgün bir şekilde doldurmasına rağmen C gibi farklı bir harf yerine B yeni dönüş değişkeni olarak kullanır.

Kafa karıştırıcı! Aslında

def toArray[C >: (A,B)](...[C]): Array[C] 

okumalı ve kısa form beklediğiniz gibi

toArray: Array[(A,B)] 

olmalıdır.

İlgili konular