这种语法陷入困境:
def foreach(f: Tweet => Unit): Unit = {
f(elem)
left.foreach(f)
right.foreach(f)
}
其中Tweet
是一个包含三个变量的类。函数返回Unit
是什么意思?我尝试了不同的东西,但在这种情况下无法调用函数本身。
请帮忙。感谢
答案 0 :(得分:4)
scala中的单位与Java中的void相同,而且,Java将Scala的Unit视为void,反之亦然。所以在java中它可以写成:
void foreach(MethodThatReturnsVoid f) {
f.apply(elem)
left.foreach(f)
right.foreach(f)
}
它有点伪代码(因为java还不支持头等功能)但是我希望你有这个想法。
答案 1 :(得分:4)
返回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)
答案 2 :(得分:1)
这里提到了Unit的定义: http://www.scala-lang.org/api/current/index.html#scala.Unit
它与java中的void不完全相同,因为它是一个子类型而不是保留字。这种设计更好,因为void
现在被视为与其他类型一样的第一类类型。由于您的代码具有显式定义的所有类型,您可以看到Unit可以替换为其他类型,并且语法仍然正确。或者,单位总是可以用{}代替或推断。在没有返回值的定义中,这可以写成如下。
def foreach(f: Tweet => Unit) { ... }