2012-05-21 6 views
11

Seq[T]'u rasgele kullanan ve Seq[T] döndüren bir yöntem uygulamak istiyorum. Ancak String sağlandığında, String'u da döndürmelidir.Yöntem, Sırası [dize] yerine Dönüş Sırasına [T] dönmek [0]

nedeniyle String den WrappedString extends IndexedSeq[Char] bazı örtük dönüştürme String eser Geçme

, ama karşılığında Seq[Char] olsun. String geri almak mümkün mü?

val sx: Seq[Int] = firstAndLast(List(1, 2, 3, 4)) 
val s1: Seq[Char] = firstAndLast("Foo Bar") 
val s2: String = firstAndLast("Foo Bar") //incompatible types error 

def firstAndLast[T](seq: Seq[T]) = Seq(seq.head, seq.last) 

firstAndLast() uygulaması sadece bir örnektir, alakasız.

cevap

15

Evet, bu mümkün. O süslü CanBuildFrom s biri gerektirecek gerekecek: Bu ayrıca dizi ile çalışacaktır

import scala.collection.generic.CanBuildFrom 

def firstAndLast[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): That = { 
    val b = cbf(seq) 
    b.sizeHint(2) 
    b += seq.head 
    b += seq.last 
    b.result 
} 

. Bonus: Örneğindeki tüm satırlar derlenecek ve beklendiği gibi çalışacaktır.

+0

Çok eminim Diziler ile çalışmayacak; –

+2

tanımlı hiçbir tanıma sahip değilsiniz. Çalışıyor çünkü gerekli 'ClassManifest', uygun 'CanBuildFrom', 'scala.Array.canBuildFrom' yöntemini sağlayan yönteme dolaylı olarak sağlanıyor. –

+2

Bu 'Miles' FromRepr ile daha kolay olmalı, sanırım. –