scala中的单位 - 无法理解

LPD*_*LPD 5 scala

我被这种语法陷入困境:

def foreach(f: Tweet => Unit): Unit = {
    f(elem)
    left.foreach(f)
    right.foreach(f)
  }
Run Code Online (Sandbox Code Playgroud)

哪个Tweet是有三个变量的类.函数返回意味着什么Unit?我尝试了不同的东西,但在这种情况下无法调用函数本身.

请帮忙.谢谢

om-*_*nom 5

Scala中的Unit与Java中的void相同,此外,Java将Scala的Unit视为void,反之亦然。因此,在Java中,它可以这样写:

void foreach(MethodThatReturnsVoid f) {
    f.apply(elem)
    left.foreach(f)
    right.foreach(f)
}
Run Code Online (Sandbox Code Playgroud)

它有点伪代码(因为Java尚不支持一流的函数),但我希望您已经明白了。

  • 准确地说,在Scala / Java界面中,Java的“ void”与Scala的“ Unit”交换或相对应。 (2认同)

小智 5

返回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)
Run Code Online (Sandbox Code Playgroud)