【问题标题】:Syntax sugar: _* for treating Seq as method parameters语法糖:_* 用于将 Seq 视为方法参数
【发布时间】:2011-05-09 18:04:12
【问题描述】:

我刚刚在网上某处注意到了这个结构:

val list = List(someCollection: _*)

_* 是什么意思?这是某些方法调用的语法糖吗?我的自定义类应该满足哪些约束才能利用这种语法糖?

【问题讨论】:

    标签: scala syntactic-sugar


    【解决方案1】:

    通常,: 表示法用于类型归属,强制编译器将值视为某种特定类型。这与强制转换完全不同。

    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]
    【解决方案2】:

    这是爆炸数组的 scala 语法。有些函数采用可变数量的参数,并且要传入一个数组,您需要将: _* 附加到数组参数。

    【讨论】:

    • Nitpick:参数只需为 Seq,或隐式转换为 Seq。
    【解决方案3】:

    变量(数量)参数使用 * 定义。 例如,

    def wordcount(words: String*) = println(words.size)

    wordcount 需要一个字符串作为参数,

    scala> wordcount("I")
    1
    

    但接受更多字符串作为其输入参数(类型描述需要_*)

    scala> val wordList = List("I", "love", "Scala")
    scala> wordcount(wordList: _*)
    3
    

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 2014-08-10
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多