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

时间:2016-03-26 06:13:17

标签: scala

我正在尝试从以下repo

中了解此快速排序代码
  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]的目的是什么?我知道[A]语法适用于泛型,但添加@sp的做法是什么?有人可以对此有所了解吗?

由于

1 个答案:

答案 0 :(得分:6)

@sp@specialized中的@specialized的别名。

我们在尖顶中使用专门化 很多 ,因此必须编写package spire package math class Foo[@sp T] 或在导入中重命名过于繁琐。

请注意,如果您有单独的包语句,则spire包对象中的定义只能从子包中看到。

所以这是有效的

package spire.math

class Foo[@sp T]

然而这不会

package scala
package collection
package immutable

scala标准库中使用了相同的方法。如果您查看类似spire package object的类,请注意package语句分三部分完成

 <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/db" />
    <property name="username" value="root" />
    <property name="password" value="password" />
</bean>