【问题标题】:Scala String* type (in function args)Scala String* 类型(在函数 args 中)
【发布时间】:2018-08-09 10:16:00
【问题描述】:

我有以下方法:

def m(a: String*) = { // ... }

我想知道这个语法中星号 (*) 的用途是什么?我显然是 Scala 的新手。我用谷歌搜索,但可能是谷歌搜索错误的东西。任何帮助表示赞赏。

干杯!

【问题讨论】:

标签: scala syntax


【解决方案1】:

它被称为“var args”(可变参数)。

def concat(strs: String*): String = strs.foldLeft("")(_ ++ _)

Scala REPL

scala> def concat(strs: String*): String = strs.foldLeft("")(_ ++ _)
concat: (strs: String*)String

scala> concat()
res6: String = ""

scala> concat("foo")
res7: String = foo

scala> concat("foo", " ", "bar")
res8: String = foo bar

【讨论】:

  • 谢谢,就这样。我非常了解这个概念,但不幸的是,我只阅读了一篇关于 scala 的教程,而且是几个月前的事了。如果我重新审视它,那就足够了。不幸的是,我愚蠢地假设它是一种类型:$
  • @hummingBird 您可以通过单独尝试轻松查看它是否是类型构造函数:type A = (Int*) 无法编译。顺便说一句:type A = (=> Int) 也无法编译。因此,这些东西不是类型构造函数,它们是决定方法如何接收参数的修饰符。而且,如果它解决了你的问题,那你能接受答案吗?
  • @AndreyTyukin 感谢您的解释。我实际上点击了几次,但不能在
【解决方案2】:

这称为repeated parameter (see Section 4.6.3 of the Scala Language Specification)。

重复参数允许方法采用未指定数量的相同类型T 的参数,这些参数可在绑定到Seq[T] 类型参数的方法主体内访问。

在您的情况下,在方法@​​987654324@ 中,参数a 将绑定到Seq[String]。

【讨论】:

    【解决方案3】:

    这是定义采用可变数量参数的方法的语法。

    您的 m 方法可以采用 0、1 或更多参数,这些都是有效的调用:

    m()
    m("hello")
    m("hello", "world")
    

    如果您使用适当的类型提示,您也可以将集合传递给该方法:

    val words = Seq("hello", "world")
    m(words: _*)
    

    您可以使用此代码here on Scastie(我将m 实现为输入字符串的串联)。

    【讨论】:

    • 类型提示是我一直在寻找的想法。谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 2019-03-15
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多