2012-10-12 4 views
9

私の理解はUnit = voidですが、なぜ私は複数の引数を渡すことができますか?以下のスカラーコードはなぜ有効ですか?

誰でも次のコードが有効である理由を説明できますか?あなたがscala -printとスニペットを実行した場合

def foo(x: Unit) = println("foo")     
foo("ss", 1) 
+2

なぜユニット型のパラメータを作成していますか?パラメータを必要としない場合は 'def foo()'を実行してください。 – sourcedelica

答えて

19

あなたはおおよそのコードのために次のような出力が得られます:あなたが見ることができるように

/* 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を返します。

私はこの動作の正当な理由がわかりません。むしろ、代わりにコンパイラエラーがスローされてしまいます。

+2

'foo(x:(String、Int))'を定義すると、引数のペアを使って上記のように呼び出すことができます。これらの引数は自動的にタプルされます。 'Unit'のために何かを渡すことができるので、あなたが実証したのとまったく同じ方法でタプル変換が適切であるようです。私はこれも気に入っているかどうかはわかりませんが、一般的にオートチューリングが原因でしょうか? –

5

これにまともな答えを与える関連する質問はここにある:

Scala: Why can I convert Int to Unit?

Scala Language Specification v2.9、 "バリュー廃棄" のセクション6.26.1から:

eは、いくつかを持っている場合期待値型はUnit、eは期待値型に変換されます。 ()}。

したがって、( "ss"、1)がタプルに変換されて単一の引数として扱われるように見える場合、その引数の型はUnitに変換されます。そのタプル値を計算するブロックは、パラメータの必要な型と一致するようにユニットを返します。

関連する問題