2017-08-30 5 views
3

メソッドパラメータString*Array[String]の間に違いはありますか?スカラ:メソッドパラメータString *と配列[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

[スカラ配列をスカラー変数法に渡す方法](https://stackoverflow.com/questions/31064753/how-to-pass-scala-array-into-scala-vararg-method) – prayagupd

答えて

4

はい、

String*が可変引数であり、それは任意の数の取り文字列、b eはSeq[String]としてメソッドに渡されます。

Array[String]は、1つの文字列を取ります。

String*として渡す文字列がある場合は、それを直接行うことはできませんが、:_*型を使用して渡すシーケンスを「スプラット」することができます。

def varArg(input: String*){} 

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

'String *'は型か、varargsがコンソール上でどのように表現されているのでしょうか?コンソールでSeq [String]というメソッドに渡されたことをどのように確認できますか? P.S.この古い答えは、Arrayとして渡されたと言いますが、ある時点でSeqに変更されましたか? https://stackoverflow.com/a/1438796 – rapt

+0

@rapt私は*タイプだとは思いますが、わかりません。これはメソッドのパラメータとしてのみ使用できます。その質問がより詳細に記されて詳細な回答形式になると、それはSeqであると言及されます。 varargsメソッドを定義して何が得られるかを見ることで、あなたの嫌なことを知ることもできます。 'def test(args:String *)= args'です。 'Seq [String]'を返すことがわかりますが、実際の実装は依存しています。具体的な実装は 'WrappedArray'ですが、引数を渡さないと' Nil'(空リスト() ') – puhlen

+0

私はそのエラーのリンクされた答えをdownvoted; Javaは配列を使用し、ScalaはSeqを使用します。繰り返されるparamの型はSeqであり、http://scala-lang.org/files/archive/spec/2.12/04-basic-declarations-and-definitions.html#repeated-parametersです。 vararg自体はコンパイラ内部の型ですが、通常はそれを認識しません。 –

2

私はthe forumに行って尋ねました。

注釈はannotation.varargsです。

私は、彼らがその接着剤を持っていたことを知っていましたが、それを使用する理由はありませんでした。

個人的には、むしろ私はむしろmainの方法では自動化されていることが明らかです。

$ 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 

OKです。

+0

おそらく私の最後の入力。 –

関連する問題