この構文に行き詰っています:
def foreach(f: Tweet => Unit): Unit = {
f(elem)
left.foreach(f)
right.foreach(f)
}
whereTweet
は 3 つの変数を持つクラスです。関数が を返すとはどういう意味Unit
ですか? さまざまなことを試しましたが、この場合、関数自体を呼び出すことができません。
助けてください。ありがとう
この構文に行き詰っています:
def foreach(f: Tweet => Unit): Unit = {
f(elem)
left.foreach(f)
right.foreach(f)
}
whereTweet
は 3 つの変数を持つクラスです。関数が を返すとはどういう意味Unit
ですか? さまざまなことを試しましたが、この場合、関数自体を呼び出すことができません。
助けてください。ありがとう
Unit を返すということは、関数が何も返さないことを意味します。つまり、関数が計算するためではなく、その副作用のために関数を呼び出しています。
foreach の例を考えると、意味のある関数がいくつかあります。
// A Tweet class with 3 values (shorter declaration than vars).
case class Tweet( a: Int, b: String, c: String )
// Print out the contents of a Tweet.
def tweetFunc( t: Tweet ): Unit = {
println( "I am a Tweet. %d %s %s".format( t.a, t.b, t.c ) )
}
// The data that is used by the foreach function.
val elem = Tweet( 1, "Hello", "World" )
val left = List( elem, Tweet( 2, "a", "b" ) )
val right = List( Tweet( 3, "c", "d" ) )
// Original foreach function.
def foreach(f: Tweet => Unit): Unit = {
f(elem)
left.foreach(f)
right.foreach(f)
}
// Call the foreach function with tweetFunc as the parameter.
foreach( tweetFunc _ )
///// OUTPUT /////
I am a Tweet. 1 Hello World // from f(elem)
I am a Tweet. 1 Hello World // from left.foreach(f)
I am a Tweet. 2 a b // from left.foreach(f)
I am a Tweet. 3 c d // from right.foreach(f)
Unit の定義はここに記載されています: http://www.scala-lang.org/api/current/index.html#scala.Unit
これは予約語ではなくサブタイプであるため、java の void と完全に同じではありません。void
他の型と同様にファースト クラスの型として扱われるようになったため、この設計は優れています。コードにはすべての型が明示的に定義されているため、 Unit を別の型に置き換えることができ、構文は依然として正しいことがわかります。または、Unit は常に {} で置き換えるか、推測することができます。戻り値のない定義では、これは次のように記述できます。
def foreach(f: Tweet => Unit) { ... }