溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Scala語言中Array類的作用是什么

發(fā)布時(shí)間:2021-08-03 10:58:15 來源:億速云 閱讀:131 作者:Leah 欄目:云計(jì)算

這篇文章將為大家詳細(xì)講解有關(guān)Scala語言中Array類的作用是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

Array類
通用數(shù)組類定義如下。
final class Array[A](len: Int) extends Seq[A] {
def length: Int = len
def apply(i: Int): A = ...
def update(i: Int, x: A): Unit = ...
def elements: Iterator[A] = ...
def subArray(from: Int, end: Int): Array[A] = ...
def filter(p: A => Boolean): Array[A] = ...
def map[B](f: A => B): Array[B] = ...
def flatMap[B](f: A => Array[B]): Array[B] = ...
}
如果T不是類型參數(shù)或抽象類型,類型Array[T]表示宿主系統(tǒng)中的原生數(shù)組類型[]T。這種情況下length返回?cái)?shù)組的長度,apply表示下標(biāo),update表示元素更新。由于apply和update操作(§6.25)的語法糖的存在,以下是Scala和Java/C#中對數(shù)組xs操作的對應(yīng):
Scala Java/C#
xs.length xs.length
xs(i) xs[i]
xs(i) = e xs[i] = e
標(biāo)準(zhǔn)引用類
數(shù)組也實(shí)現(xiàn)了序列特征scala.Seq,定義了elements方法來返回一個(gè)包含數(shù)組中所有元素的Iterator
因?yàn)樵赟cala中參數(shù)化類型的數(shù)組和宿主語言中數(shù)組的實(shí)現(xiàn)還是有差異的,在處理數(shù)組時(shí)需要注意一些細(xì)小的差別。解釋如下。
首先,不像Java或C#中的數(shù)組,Scala中的數(shù)組不是協(xié)變的;也就是說,在Scala中S<:T并不能得出Array[S] <: Array[T]。但是如果在宿主環(huán)境中可以將S變?yōu)門則可以將S的數(shù)組變?yōu)門的數(shù)組。
舉例來說Array[String]并不與Array[Object]一致,即使String與Object一致。然而可以將類型為Array[String]的表達(dá)式變?yōu)锳rray[Object]。該轉(zhuǎn)變將會成功,不會拋出ClassCastException。例子如下:
val xs = new Array[String](2)
// val ys: Array[Object] = xs // **** 錯(cuò)誤:不兼容的類型
val ys: Array[Object] = xs.asInstanceOf[Array[Object]] //OK
其次,對于有一個(gè)類型參數(shù)或抽象類型T作為元素類型的多態(tài)數(shù)組,其表現(xiàn)形式不同于[]T。然而isInstanceOf和asInstanceOf仍像數(shù)組數(shù)組使用單態(tài)數(shù)組的標(biāo)準(zhǔn)表現(xiàn)形式那樣正常工作。
val ss = new Array[String](2)
def f[T](xs: Array[T]): Array[String] =
if(xs.isInstanceOf[Array[String]]) xs.asInstanceOf[Array[String]]
else throw new Error(“not an instance”)
f(ss) // 返回ss
多態(tài)數(shù)組的表現(xiàn)形式同樣保證了多態(tài)數(shù)組的創(chuàng)建與期望一致。以下是一個(gè)mkArray方法的例子,給定定義了元素且類型為T的序列創(chuàng)建任意類型T的數(shù)組。
def mkArray[T](elems: Seq[T]): Array[T] = {
val result = new Array[T](elems.length)
val I = 0
for (elem <- elems) {
result(i) = elem
I += 1
}
}
注意在Java數(shù)組的類型擦除模型下,以上方法不能按照期望的方式工作-實(shí)際上它將總是返回一個(gè)Object數(shù)組。
再次,在Java環(huán)境中有一個(gè)方法System.arraycopy,有兩個(gè)對象為參數(shù),指定起始坐標(biāo)和長度,將元素從一個(gè)對象復(fù)制到另外一個(gè)對象,這兩個(gè)對象的元素類型必須是兼容的。對于Scala的多態(tài)數(shù)組該方法不能正常工作,因?yàn)樗麄冇胁煌谋憩F(xiàn)形式。作為代替應(yīng)當(dāng)使用Array類的伴隨對象Array.copy方法。該伴隨對象也定義了不同的數(shù)組構(gòu)造方法,還定義了提取方法unapplySeq(§8.1.7),提供了數(shù)組上的模式匹配。
package scala
Scala 標(biāo)準(zhǔn)庫
object Array {
/** 從?src?復(fù)制元素到?dest? */
def copy(src: AnyRef, srcPos: Int, dest: AnyRef,
destPos: Int, length: Int): Unit = ...
/** 將參數(shù)中所有數(shù)組合并為一個(gè) */
def concat[T](xs: Array[T]*): Array[T] = ...
/** 創(chuàng)建一個(gè)連續(xù)的整數(shù)數(shù)組 */
def range(start: Int, end: Int): Array[Int] = ...
/** 用給定元素創(chuàng)建一個(gè)數(shù)組 */
def apply[A <: AnyRef](xs: A*): Array[A] = ...
/** 與上面類似 */
def apply(xs: Boolean*) : Array[Boolean] = ...
def apply(xs: Byte*) : Array[Byte] = ...
def apply(xs: Short*) : Array[Short] = ...
def apply(xs: Char*) : Array[Char] = ...
def apply(xs: Int*) : Array[Int] = ...
def apply(xs: Long*) : Array[Long] = ...
def apply(xs: Float*) : Array[Float] = ...
def apply(xs: Double*) : Array[Double] = ...
def apply(xs: Unit*) : Array[Unit] = ...
/** 創(chuàng)建一個(gè)數(shù)組,包含一個(gè)元素的多個(gè)拷貝 */
def make[A](n: Int, elem: A): Array[A] = ...
/** 提供數(shù)組上的模式匹配 */
def unapplySeq[A](x: Array[A]): Option[Seq[A]] = Some(x)
}
示例12.3.1 以下方法復(fù)制給定的數(shù)組參量并返回初始數(shù)組和復(fù)制的數(shù)組:
def duplicate[T](xs: Array[T]) = {
val ys = new Array[T](xs.length)
Array.copy(xs, 0, ys, 0, xs.length)
(xs, ys)
}

關(guān)于Scala語言中Array類的作用是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI