2016-03-26 18 views
2

aşağıdaki repoScala için bu hızlı sıralama kodunda bu `sp` sözdizimi nedir?

object QuickSort { 
    @inline final def limit: Int = 16 

    final def sort[@sp A:Order:ClassTag](data:Array[A]): Unit = qsort(data, 0, data.length - 1) 

    final def qsort[@sp A](data:Array[A], left: Int, right: Int)(implicit o:Order[A], ct:ClassTag[A]): Unit = { 

     if (right - left < limit) return InsertionSort.sort(data, left, right + 1) 

     val pivot = left + (right - left)/2 
     val next = partition(data, left, right, pivot) 
     qsort(data, left, next - 1) 
     qsort(data, next + 1, right) 
    } 

    final def partition[@sp A](data:Array[A], left:Int, right:Int, pivot:Int)(implicit o:Order[A], ct:ClassTag[A]): Int = { 

     val value = data(pivot) 

     //swap(pivot, right) 
     var tmp = data(pivot); data(pivot) = data(right); data(right) = tmp 

     var store = left 
     var i = left 
     while (i < right) { 
     if (o.lt(data(i), value)) { 
      //swap(i, store) 
      tmp = data(i); data(i) = data(store); data(store) = tmp 
      store += 1 
     } 
     i += 1 
     } 
     //swap(store, right) 
     tmp = data(store); data(store) = data(right); data(right) = tmp 
     store 
    } 
    } 

[@sp A] amacı nedir bu hızlı sort kodu anlamaya çalışıyorum? Ben [A] sözdizimi jenerikler için biliyorum, ama @sp ekleme ne yapar? Birisi bunun hakkında bir fikir verebilir mi?

Teşekkür

cevap

6

@spspire package object tanımlanan @specialized için bir diğer adıdır.

Biz uzmanlaşma kullandığınız sivri yüzden @specialized yazmak zorunda veya ithalatta yeniden adlandırma çok sıkıcı var çok.

Spire paket nesnesindeki tanımların, tekil paket ifadeleriniz varsa yalnızca görünür form alt paketleri olacağını unutmayın.

Yani bu bu Oysa

package spire 
package math 

class Foo[@sp T] 

çalışır olmaz

package spire.math 

class Foo[@sp T] 

aynı yaklaşım scala standart kütüphanede kullanılmaktadır. scala.collection.immutable.Set gibi bir sınıfa bakarsanız, paket ifadesinin üç bölümden oluşur:

package scala 
package collection 
package immutable