2009-06-17 25 views
54

Tôi xé tóc của tôi ra cố gắng tìm ra cách để làm như sau:Sử dụng varargs từ Scala

def foo(msf: String, o: Any, os: Any*) = { 
    println(String.format(msf, o :: List(os:_*))) 
} 

Có một lý do tại sao tôi phải khai báo các phương thức với một o và một osSeq riêng. Về cơ bản, tôi kết thúc với phương thức định dạng được gọi với một tham số đối tượng đơn (thuộc loại List). Cố gắng:

def foo(msf: String, o: Any, os: Any*) = { 
    println(String.format(msf, (o :: List(os:_*))).toArray) 
} 

Cung cấp cho tôi những lỗi loại: đúc

found: Array[Any]

required Seq[java.lang.Object]

tôi đã cố gắng, mà biên dịch nhưng không vì khá nhiều lý do tương tự như ví dụ đầu tiên. Khi tôi cố gắng

println(String.format(msg, (o :: List(os:_*)) :_*)) 

này thất bại trong việc biên soạn với sự mơ hồ ngầm chuyển đổi (any2ArrowAssocany2stringadd)

Trả lời

65
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
    println(String.format(msf, (o :: os.toList).toArray : _*)) 
+0

Nó biên dịch nhưng giảm hơn khi chạy: Exception in thread "main" java.lang.ClassCastException:. $ Ruột $ ruột scala không thể được đúc để scala.runtime.BoxedObjectArray \t tại scala.runtime.RichString .format (RichString.scala: 242) –

+0

Ngoài ra, toList đến từ đâu? –

+0

Đã sửa lỗi, nó hoạt động ngay bây giờ. Tôi đang gửi một báo cáo lỗi - Scala không nên có ClassCastExceptions ngoại trừ khi bạn đã sử dụng asInstanceOf. toList là một phương pháp trên Iterable [A] –

12
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
    println(String.format(msf, o :: os.toList : _*)) 

hoặc

def foo(msf: String, o: AnyRef, os: AnyRef*) = 
     println(msf format (o :: os.toList : _*)) 

Tôi rất thích sau này, dù nó có không hỗ trợ locale *.

  • Scala 2.8 không hỗ trợ ngôn ngữ với định dạng RichString.
+0

Sử dụng phương pháp định dạng RichString là những gì tôi đã chọn cuối cùng –

Các vấn đề liên quan