私の理解はUnit
=void
ですが、なぜ複数の引数を渡すことができるのですか?
では、次のコードが有効である理由を誰かが説明できますか?
def foo(x: Unit) = println("foo")
foo("ss", 1)
私の理解はUnit
=void
ですが、なぜ複数の引数を渡すことができるのですか?
では、次のコードが有効である理由を誰かが説明できますか?
def foo(x: Unit) = println("foo")
foo("ss", 1)
スニペットをで実行するscala -print
と、コードの次の出力が大まかに得られます。
/* Definition of foo */
private def foo(x: scala.runtime.BoxedUnit): Unit = {
/* Invocation of foo */
foo({
new Tuple2("ss", scala.Int.box(1));
scala.runtime.BoxedUnit.UNIT
});
ご覧のとおり、の引数foo
は、タプルを作成するがUNITを返すコードブロックに書き直されます。
この動作の正当な理由がわかりません。代わりに、コンパイラエラーがスローされます。
これにまともな答えを与える関連する質問はここにあります:
Scala言語仕様v2.9のセクション6.26.1 「値の破棄」から:
eに何らかの値型があり、期待される型がUnitの場合、eは項{e;に埋め込むことによって期待される型に変換されます。()}。
したがって、あなたの場合、( "ss"、1)は単一の引数として扱われるようにタプルに変換されているように見えます。次に、その引数の型はUnitではないため、そのタプルを計算するブロックに変換されます。次に、valueは、必要なタイプのパラメーターと一致する単位を返します。