2011-06-20 26 views
6

Tôi là người mới đến scala. Tôi cố gắng để viết một hàm được "lặp lại" một Array (Scala 2.9.0):Scala repeat Array

def repeat[V](original: Array[V],times:Int):Array[V]= { 
if (times==0) 
    Array[V]() 
else 
    Array.concat(original,repeat(original,times-1) 
} 

Nhưng tôi không thể để biên dịch này (nhận được một lỗi về manifest) ...

Trả lời

6

bạn cần phải hỏi biên dịch để cung cấp lớp manifest cho V:

def repeat[V : Manifest](original: Array[V], times: Int): Array[V] = ... 

câu trả lời cho câu hỏi: tại sao là cần thiết, bạn có thể tìm thấy ở đây:

Why is ClassManifest needed with Array but not List?

Tôi không chắc chắn nơi bạn muốn sử dụng, nhưng tôi thường có thể khuyên bạn nên sử dụng List hoặc bộ sưu tập phù hợp khác thay vì Array.

+0

tôi muốn mở rộng một lớp học mà cần mảng như là đầu vào (cụ thể hơn lớp DenseMatrix từ scalala). Có các loại số (@specialized) được chuyển đổi hoàn toàn thành 'Scalar'. Nhưng bạn luôn cần phải cung cấp cho toàn bộ mảng. Tôi muốn có một cách tiếp cận gần 'R', tức là khi mảng không có độ dài yêu cầu, chỉ cần lặp lại và có thể cắt nó để nó phù hợp ... – teucer

5

BTW, một cách khác để lặp lại một mảng, sẽ được "lấp đầy" một Seq với sự tham khảo của Array và sau đó san bằng rằng:

def repeat[V: Manifest](original: Array[V], times: Int) : Array[V] = 
    Seq.fill(times)(original).flatten.toArray;