2つの引数を渡す場合と1つの引数を渡す場合の違いは何ですか?scalaオプションのタイプの違い
val option1 = Option(String,String)
and
val option2 = Option(String)
2つの引数を渡す場合と1つの引数を渡す場合の違いは何ですか?scalaオプションのタイプの違い
val option1 = Option(String,String)
and
val option2 = Option(String)
: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))
これは好みの問題です、しかし。
Jörgが他の答えにコンパイルエラーを起こしたのはどうしてですか?オートチューリングは確実に機能しません(電源を切ることができますか、またはREPLなどで利用できません)。 – Thilo
@Thilo彼は実際にコンパイルしようとしていたコードがわかりません。私が知る限り、auto-tuplingをオフにすることはできませんが、 '-Ywarn-adapt-args'と致命的なエラーがあなたに類似しています。 –
@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))) –
ありつの引数を有する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
よろしいですか? REPLで実行して、結果を観察してください。 – jwvh