私の理解はUnit
= void
ですが、なぜ私は複数の引数を渡すことができますか?以下のスカラーコードはなぜ有効ですか?
誰でも次のコードが有効である理由を説明できますか?あなたがscala -print
とスニペットを実行した場合
def foo(x: Unit) = println("foo")
foo("ss", 1)
私の理解はUnit
= void
ですが、なぜ私は複数の引数を渡すことができますか?以下のスカラーコードはなぜ有効ですか?
誰でも次のコードが有効である理由を説明できますか?あなたがscala -print
とスニペットを実行した場合
def foo(x: Unit) = println("foo")
foo("ss", 1)
あなたはおおよそのコードのために次のような出力が得られます:あなたが見ることができるように
/* 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を返します。
私はこの動作の正当な理由がわかりません。むしろ、代わりにコンパイラエラーがスローされてしまいます。
'foo(x:(String、Int))'を定義すると、引数のペアを使って上記のように呼び出すことができます。これらの引数は自動的にタプルされます。 'Unit'のために何かを渡すことができるので、あなたが実証したのとまったく同じ方法でタプル変換が適切であるようです。私はこれも気に入っているかどうかはわかりませんが、一般的にオートチューリングが原因でしょうか? –
これにまともな答えを与える関連する質問はここにある:
Scala: Why can I convert Int to Unit?
Scala Language Specification v2.9、 "バリュー廃棄" のセクション6.26.1から:
eは、いくつかを持っている場合期待値型はUnit、eは期待値型に変換されます。 ()}。
したがって、( "ss"、1)がタプルに変換されて単一の引数として扱われるように見える場合、その引数の型はUnitに変換されます。そのタプル値を計算するブロックは、パラメータの必要な型と一致するようにユニットを返します。
なぜユニット型のパラメータを作成していますか?パラメータを必要としない場合は 'def foo()'を実行してください。 – sourcedelica