Giả sử rằng tôi tuyên bố một chức năng như sau:Loại danh sách đối số có độ dài biến trong Scala là gì?
def test(args: String*) = args mkString
loại args
là gì?
Giả sử rằng tôi tuyên bố một chức năng như sau:Loại danh sách đối số có độ dài biến trong Scala là gì?
def test(args: String*) = args mkString
loại args
là gì?
Đ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)
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