【发布时间】:2011-05-09 18:04:12
【问题描述】:
我刚刚在网上某处注意到了这个结构:
val list = List(someCollection: _*)
_* 是什么意思?这是某些方法调用的语法糖吗?我的自定义类应该满足哪些约束才能利用这种语法糖?
【问题讨论】:
标签: scala syntactic-sugar
我刚刚在网上某处注意到了这个结构:
val list = List(someCollection: _*)
_* 是什么意思?这是某些方法调用的语法糖吗?我的自定义类应该满足哪些约束才能利用这种语法糖?
【问题讨论】:
标签: scala syntactic-sugar
通常,: 表示法用于类型归属,强制编译器将值视为某种特定类型。这与强制转换完全不同。
val b = 1 : Byte
val f = 1 : Float
val d = 1 : Double
在这种情况下,您将赋予特殊的 varargs 类型。这反映了用于声明 varargs 参数的星号符号,并且可以用于任何类型的变量,该变量是 Seq[T] 的子类:
def f(args: String*) = ... //varargs parameter, use as an Array[String]
val list = List("a", "b", "c")
f(list : _*)
【讨论】:
String* 的字符串数组,但出现无法解析 * 的错误。如果我返回 Array[String] 并将其传递给带有 args 的方法 (args: String*) 它表示期待 String 而不是 Array[String]
这是爆炸数组的 scala 语法。有些函数采用可变数量的参数,并且要传入一个数组,您需要将: _* 附加到数组参数。
【讨论】:
Seq,或隐式转换为 Seq。
变量(数量)参数使用 * 定义。 例如,
def wordcount(words: String*) = println(words.size)
wordcount 需要一个字符串作为参数,
scala> wordcount("I")
1
但接受更多字符串作为其输入参数(类型描述需要_*)
scala> val wordList = List("I", "love", "Scala")
scala> wordcount(wordList: _*)
3
【讨论】: