这个scala快速排序代码中的`@sp`语法是什么?

Kev*_*vin 2 scala

我试图从以下回购中了解这个快速排序代码

  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
    }
  }
Run Code Online (Sandbox Code Playgroud)

目的是[@sp A]什么?我知道[A]语法是针对泛型的,但添加的@sp是什么?有人可以对此有所了解吗?

谢谢

Rüd*_*ehn 6

@spspire包对象中@specialized定义的别名.

我们在尖顶中使用了很多专业化,因此必须@specialized在进口中编写或重命名太繁琐了.

请注意,如果您有单独的包语句,则spire包对象中的定义仅在子包中可见.

这样可行

package spire
package math

class Foo[@sp T]
Run Code Online (Sandbox Code Playgroud)

然而,这不会

package spire.math

class Foo[@sp T]
Run Code Online (Sandbox Code Playgroud)

在scala标准库中使用相同的方法.如果你看一下像scala.collection.immutable.Set这样的类,请注意package语句分三部分完成

package scala
package collection
package immutable
Run Code Online (Sandbox Code Playgroud)