2017-08-30 98 views
3

方法参数String*Array[String]之间是否有区别?Scala:方法参数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) 
+1

[如何将scala数组传递给scala可变参数方法?](https://stackoverflow.com/questions/31064753/how-to-pass-scala-array-into-scala-vararg-method) – prayagupd

回答

4

是,

String*是一个可变参数,它需要在任意数量的字符串,这将b通过该方法作为Seq[String]

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

如果您想要作为String*传递的字符串序列不能直接执行,但可以使用:_*类型归属来“传出”序列以传递它。

def varArg(input: String*){} 

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

那么'String *'是一种类型还是在控制台中如何表示可变长度?我如何在控制台中看到它作为Seq [String]传递给方法?附:这个旧的答案说它是以Array的形式传递的,它在某些时候是否改变为Seq? https://stackoverflow.com/a/1438796 – rapt

+0

@rapt我认为*这是一种类型,但我不知道。它只能用作方法参数。这个问题的答复形式更为有效,并提到它是一个Seq。你也可以通过定义可变参数方法并查看你得到的结果来找出排斥中的你。 'def test(args:String *)= args'。我们看到它返回一个'Seq [String]',但实际的实现依赖于,当我们传入参数时,具体的实现是'WrappedArray',但是如果我们不传递任何参数,它就是'Nil'(空List又名。 ()') – puhlen

+0

我低估了该错误的链接答案; Java使用数组,Scala使用Seq。重复的参数的类型是Seq,http://scala-lang.org/files/archive/spec/2.12/04-basic-declarations-and-definitions.html#repeated-parameters。可变参数本身是编译器内部的一种类型,但我们通常不会看到这种情况。 –

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 

好,很酷。

+0

可能是我在SO上的最后一个输入。 –

相关问题