ここにはコードがあります:
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は4Unit
は 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 = ()
回答№2については4
あなたの例から作業しています...
def foo(bar: Unit => String) = {bar}
これは foo
からの関数を受け入れるメソッド Unit
に String
その唯一の引数として、そして単に同じ引数を返します。
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
インスタンス、つまり: 「()」