2017-08-30 97 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上的最後一個輸入。 –

相關問題