/ /誰かがここで何が起こっているのか説明できますか? --scala、ユニットタイプ

誰かがここで何が起こっているのか説明できますか? - スカラ、ユニット型

ここにはコードがあります:

scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String

scala> foo(a => a.toString)
res0: (Unit) => String = <function1>

はUnit型だと思いますが、Unitはオブジェクトではありませんか?Unitクラスは非表示ですか?

回答:

回答№1は4

UnitAnyVal好き 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 = ()

回答№2については4

あなたの例から作業しています...

def foo(bar: Unit => String) = {bar}

これは foo からの関数を受け入れるメソッド UnitString その唯一の引数として、そして単に同じ引数を返します。

foo(a => a.toString)

a => a.toString 関数をインラインで定義します。型推論器は関数がそのことを知っているからです Unit => String この場所で期待されている、それは推測します a タイプの Unit.

この呼び出し foo 次に、定義した匿名関数を返します。

私は興味があります、あなたはここで正確に何を達成しようとしていましたか?それともScalaの構文を探求しただけですか?


答え№3の2

Scalaで Unit Javaと同等です void。パラメータのない別の関数を受け入れ、を返す関数を定義しました String.

これは def foo(bar: => String); または def foo(bar: () => String)

Scalaで () のショートカットです Unit


答え№4の2

ケビンライトによって与えられた答えは完全に正しいですが、それをさらに分解するために:

最初の行は、と呼ばれる関数を宣言しています foo. foo その引数として別の関数を取ります、 bar それ自体が取り入れます Unit を返します。 String。一般的に言えば、 Unit Scalaでは同じ意味です void 他の多くの言語で行うので、ほとんどの場合、 bar 引数を受け取らず、を返す関数です。 String.

の本体 foo 関数は、受け取った引数を返すだけです。したがって、scalaはそれを推測します foo 取る関数を返します Unit を返します。 String.

2番目のコマンドは foo 機能付き a => a.toString その議論として。 a タイプであると想定されます Unit。もし Unit の正確なアナログでした void、これは機能しません。電話することはできません toString 何かがない場合。しかしながら、 Unit このような状況では、動作が少し異なります。 a のインスタンスが与えられます Unit。このインスタンスは実際には多くのことを行うことはできませんが、 toString それを求めた。したがって、2番目のコマンドの結果は、次の結果を返す関数になります。 toString に呼ばれる Unit インスタンス、つまり: 「()」