为什么我被允许将一个返回非Unit的函数传递给一个带有返回Unit的函数的方法?

时间:2014-10-28 02:49:53

标签: scala

以下是代码:

def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = {
  foreach(tweet =>
    if(p(elem)) acc.incl(elem)
    else acc.incl(elem))
  acc
}

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

def incl(x: Tweet): TweetSet = {
  if (x.text < elem.text) new NonEmpty(elem, left.incl(x), right)
  else if (elem.text < x.text) new NonEmpty(elem, left, right.incl(x))
  else this
}

foreach需要f,返回Unit incl会返回TweetSet 我传入filterAcc的函数似乎返回TweetSet,因为if和else调用incl中的最后一行。是这样的情况,即使一个值显示为返回Unit的函数的最后一行,它也只是不会返回该值?对不起,如果这是一个基本问题,我是一个全新的程序员。

1 个答案:

答案 0 :(得分:6)

这是Unit的特例。如果将一个返回非Unit类型的函数f(或值)传递给另一个期望Unit类型的函数,则会丢弃非Unit值以支持Unit

来自Scala spec - 6.26.2 Value Conversions

  

价值放弃

     

如果e具有某种值类型且预期类型为Unit,则通过将e嵌入到术语{e;中来将e转换为期望类型。 ()}。

这对于调用副作用函数的情况非常有用,该函数返回的值不是Unit,但您并不关心该值是什么(无论出于何种原因)。