質問

これがコードです:

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 メソッド、からの関数を受け入れます UnitString その唯一の議論として、そして単にその同じ議論を返すだけです。

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 インスタンス、 "()"

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top