【问题标题】:Scala: Is there a difference between method parameter String* and Array[String]Scala:方法参数String *和Array [String]之间有区别吗
【发布时间】:2017-08-30 22:59:43
【问题描述】:

方法参数String*Array[String]有区别吗?

控制台:

scala> def main(args: Array[String]): Unit = {}
main: (args: Array[String])Unit

scala> def main(args: String*): Unit = {}
main: (args: String*)Unit

代码 1:

object Example {
  def main(args: Array[String]): Unit = {
    println("Hello")
  }
}

>> Hello

代码 2:

object Example {
  def main(args: String*): Unit = {
    println("Hello")
  }
}

>> Exception in thread "main" java.lang.NoSuchMethodException: Example.main([Ljava.lang.String;)
    at java.lang.Class.getMethod(Class.java:1786)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:126)

【问题讨论】:

标签: scala


【解决方案1】:

是的,

String* 是一个可变参数,它接受任意数量的字符串,这些字符串将作为Seq[String] 传递给方法。

Array[String] 接收单个字符串数组。

如果您有一个字符串序列要作为String* 传递,则不能直接这样做,但您可以使用:_* 类型说明“拼出”序列以将其传递。

def varArg(input: String*){}

val strings = Seq("hello", "world")
varArg(strings:_*)

【讨论】:

  • String* 是一种类型,还是 varargs 在控制台中的表达方式?如何在控制台中看到它作为 Seq[String] 传递给方法?附言这个旧答案说它是作为数组传递的,它是否在某个时候更改为 Seq? stackoverflow.com/a/1438796
  • @rapt 我 认为 这是一种类型,但我不确定。无论哪种方式,它都只能用作方法参数。该问题的更受欢迎和更详细的答案形式还提到它是一个 Seq。您还可以通过定义 varargs 方法并查看您得到的结果,在排斥中找到您自己。 def test(args: String*) = args。我们看到它返回一个Seq[String],但实际实现取决于,当我们传入参数时,具体实现是WrappedArray,但如果我们不传递任何参数,它是Nil(又名空列表。List()
  • 我否决了该错误的链接答案; Java 使用数组,Scala 使用 Seq。重复参数的类型为 Seq,scala-lang.org/files/archive/spec/2.12/…。可变参数本身是编译器内部的类型,但我们通常看不到。
  • 如果你能让编译器建立一个到可变参数主函数的桥梁会很酷,我不知道他们为什么不这样做。值得补充的是,这就是 App 的用途。
【解决方案2】:

我去the forum问了。

你要的注解是annotation.varargs

我预感到他们有那种胶水,但我从来没有理由使用它。

就个人而言,我宁愿它是自动的 main 方法,b/c 很明显。

$ scala
Welcome to Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions for evaluation. Or try :help.

scala> object Main { @annotation.varargs def main(args: String*) =
     | println(args.size)
     | }
defined object Main

scala> Main.main(Array("hello","world"): _*)
2

好的,很酷。

【讨论】:

  • 可能是我最后一次输入 SO。
猜你喜欢
  • 1970-01-01
  • 2011-07-19
  • 2016-11-09
  • 2011-10-03
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多