6

我被这种语法所困扰:

def foreach(f: Tweet => Unit): Unit = {
    f(elem)
    left.foreach(f)
    right.foreach(f)
  }

whereTweet是一个具有三个变量的类。函数返回是什么意思Unit?我尝试了不同的方法,但在这种情况下无法调用函数本身。

请帮忙。谢谢

4

3 回答 3

5

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

void foreach(MethodThatReturnsVoid f) {
    f.apply(elem)
    left.foreach(f)
    right.foreach(f)
}

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

于 2013-04-24T18:09:55.747 回答
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)
于 2013-04-25T00:57:35.670 回答
1

这里提到了 Unit 的定义: http ://www.scala-lang.org/api/current/index.html#scala.Unit

它与 java 中的 void 并不完全相同,因为它是子类型而不是保留字。这种设计更好,因为void现在像其他类型一样被视为头等类型。由于您的代码明确定义了所有类型,因此您可以看到 Unit 可以替换为另一种类型,并且语法仍然正确。或者,Unit 始终可以替换为 {} 或推断。在没有返回值的定义中,可以这样写。

def foreach(f: Tweet => Unit) { ... }
于 2013-04-24T18:32:07.063 回答