2017-03-11 3 views
1

2つの引数を渡す場合と1つの引数を渡す場合の違いは何ですか?scalaオプションのタイプの違い

val option1 = Option(String,String) 
and 
val option2 = Option(String) 
+7

よろしいですか? REPLで実行して、結果を観察してください。 – jwvh

答えて

8

Stringはタイプではない値であり、そしてあなたが不可能である引数として型を渡すしようとしているためエラーになりますOption(1, 2)のような信奉何か、コンパイラは最初Option.apply(1, 2)にこれをdesugars、そしてそれがOptionコンパニオンオブジェクトは、2つの引数を取りapply方法を持っていないことを見ているときに、それが自動的にタプルに引数を変換します

scala> Option(1, 2) 
res0: Option[(Int, Int)] = Some((1,2)) 

Option(1, 2, 3),Option(1, 2, 3, 4)などのようなものがあります。

これはオートチューリングと呼ばれ、引数が1つのメソッドに対してのみ機能します。

scala> def foo[T](t: T, u: T): T = t 
foo: [T](t: T, u: T)T 

scala> foo(1, 2, 3) 
<console>:13: error: too many arguments for method foo: (t: T, u: T)T 
     foo(1, 2, 3) 
     ^

この「機能は、」構文便宜のために提供され、そしてそれは少し他の関数型言語に(少なくとも表面的な方法で)近いところタプルと機能をスカラをもたらします:たとえば、次のようにコンパイルされません引数リストはより統一されています。しかし、実際にはScalaでは統一されていないため、混乱したコードや迷惑なエラーメッセージにつながる可能性があるため、多くの人がオートチューリングを嫌っています。あなたはこれらの人々(私が)のいずれかをしている場合、コンパイラはこれを実行しようとしたとき、あなたはあなたに警告を与える-Ywarn-adapted-argsコンパイラフラグをオンにすることができます

scala> Option(1, 2) 
<console>:12: warning: Adapting argument list by creating a 2-tuple: this may not be what you want. 
     signature: Option.apply[A](x: A): Option[A] 
    given arguments: 1, 2 
after adaptation: Option((1, 2): (Int, Int)) 
     Option(1, 2) 
      ^
res0: Option[(Int, Int)] = Some((1,2)) 

これは好みの問題です、しかし。

+0

Jörgが他の答えにコンパイルエラーを起こしたのはどうしてですか?オートチューリングは確実に機能しません(電源を切ることができますか、またはREPLなどで利用できません)。 – Thilo

+1

@Thilo彼は実際にコンパイルしようとしていたコードがわかりません。私が知る限り、auto-tuplingをオフにすることはできませんが、 '-Ywarn-adapt-args'と致命的なエラーがあなたに類似しています。 –

+0

@TravisBrown私はRDD [(Int、(Option [String]、Option [(Option [String]、Option [String])]))]を持っています。私はcase(id:Int、option1、optionTuple)を持つことができ、optionTupel._1とoptionTuple._2を使って値にアクセスします。 (id:Int、(option1、optionTupel(tuple1、tuple2))) –

1

ありつの引数を有するOption.applyの過負荷がないので、2つの間の単純な差は最初の引数の数に関連するエラー与えることである:第1のに対し

error: too many arguments (2) for method apply: (x: A)Option[A] in object Option 

をあなたはWR

error: object java.lang.String is not a value 
+1

私はOPが求めているものではないが、オプション( "Jam Baxter"、 "Dirty Dike") 'vs' Option( "Fliptrix") ' – prayagupd

+0

を要求しているように感じる。 .lang.Stringは両方の場合の値ではありませんか?あなたが本当の価値を提供する場合、「適用する引数が多すぎます」は意味をなさないためです。 012オプションの "Jam Baxter"、 "Dirty Dike") – prayagupd

+0

OPの質問から直接コード*を切り取ってペーストしました。これらの結果は私が得た結果です(少なくとも2番目の結果)。 –

関連する問題