2012-11-03 28 views

Trả lời

32

Điều này được gọi là một số biến đối số hoặc trong các biến thể ngắn. Đây là loại tĩnh là Seq[T] trong đó T đại diện cho T*. Bởi vì Seq[T] là một giao diện, nó không thể được sử dụng như một triển khai thực hiện, trong trường hợp này là scala.collection.mutable.WrappedArray[T]. Để tìm hiểu những việc như vậy nó có thể hữu ích để sử dụng REPL:

// static type 
scala> def test(args: String*) = args 
test: (args: String*)Seq[String] 

// runtime type 
scala> def test(args: String*) = args.getClass.getName 
test: (args: String*)String 

scala> test("") 
res2: String = scala.collection.mutable.WrappedArray$ofRef 

varargs thường được sử dụng kết hợp với các _* biểu tượng, mà là một gợi ý để trình biên dịch để vượt qua các yếu tố của một Seq[T] đến một chức năng thay vì của chính trình tự:

scala> def test[T](seq: T*) = seq 
test: [T](seq: T*)Seq[T] 

// result contains the sequence 
scala> test(Seq(1,2,3)) 
res3: Seq[Seq[Int]] = WrappedArray(List(1, 2, 3)) 

// result contains elements of the sequence 
scala> test(Seq(1,2,3): _*) 
res4: Seq[Int] = List(1, 2, 3) 
+1

Vâng, điều này có tác dụng thú vị mà bạn không thể chuyển qua var-len args ngay lập tức, 'def f1 (args: Int *) = args.length; def f2 (args: Int *) = f1 (args) '. Nó sẽ cho 'tìm thấy Seq [Int] trong khi Int được yêu cầu lỗi không khớp trong định nghĩa f2. Để phá vỡ, bạn cần phải 'def f2 = f1 (args: _ *)'. Vì vậy, trình biên dịch cho rằng đối số là một giá trị duy nhất và trình tự tại cùng một, tại thời gian biên dịch :) – Val

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