質問
これがコードです:
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String
scala> foo(a => a.toString)
res0: (Unit) => String = <function1>
私はタイプユニットのものであると推測していますが、ユニットはオブジェクトではありませんか?ユニットクラスは隠されていますか?
解決
Unit
です AnyVal
, 、 お気に入り Int
. 。その唯一のメンバーは、文字通りで書かれています ()
. 。例えば:
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: Unit => String)Unit => String
scala> foo(a => a.toString)
res0: Unit => String = <function1>
scala> res0(())
res1: String = ()
他のヒント
あなたの例から働いています...
def foo(bar: Unit => String) = {bar}
これはを定義します foo
メソッド、からの関数を受け入れます Unit
に String
その唯一の議論として、そして単にその同じ議論を返すだけです。
foo(a => a.toString)
a => a.toString
関数のインラインを定義します。タイプの推測者はその関数を知っているからです Unit => String
この場所で予想されます、それは推進します a
タイプの場合 Unit
.
のこの呼び出し foo
次に、定義したばかりの匿名関数を返します。
私は興味があります、あなたはここで何を達成しようとしていましたか?それとも、Scalaの構文を探索していましたか?
Scalaで Unit
Javaのものと同等です void
. 。パラメーターなしで別の関数を受け入れ、 String
.
これはに相当します def foo(bar: => String);
または def foo(bar: () => String)
Scalaで ()
のショートカットです Unit
ケビン・ライトによって与えられた答えは完全に正しいですが、それをさらに分解するために:
最初の行は、呼ばれる関数を宣言することです foo
. foo
その議論として別の機能を取ります、 bar
それ自体が取り入れます Unit
そして、aを返します String
. 。一般的に言えば、 Unit
Scalaでは、同じ意味があります void
他の多くの言語で行うので、ほとんどの場合、 bar
議論を取り入れず、 String
.
の体 foo
関数は、受け取った引数を単に返すだけです。したがって、Scalaはそれを推進します foo
取る関数を返します Unit
そして、aを返します String
.
2番目のコマンド呼び出し foo
関数で a => a.toString
その議論として。 a
タイプであると想定されています Unit
. 。もしも Unit
正確なアナログでした void
, 、これはうまくいきません。電話することはできません toString
何かがないことについて。でも、 Unit
このような状況のために、正確には少し異なって動作し、 a
のインスタンスが与えられます Unit
. 。このインスタンスは本当に多くのことができることはありませんが、 toString
それを呼びかけました。したがって、2番目のコマンドの結果は、 toString
に呼ばれました Unit
インスタンス、 "()"