1

我有的

我在下面有一个功能(我无法更改外部功能)

def outer(x: Int, inner: Int => Boolean): Boolean = {
    inner(x)
    false
} 

我想要的是

以这样的方式定义内部函数: if (x == 10)外部函数返回true

def inner(x: Int): Boolean = {
  if (x == 10) OUTER_FUNCTION_SHOULD_RETURN_TRUE!!!
  else false
}

outer(10, inner) // TRUE!!

问题

我该怎么做?

编辑:

我使用下一个技巧:

// If inner return true at least once, then outerWraper return true
def outerWrapper(x: Int, inner: Int => Boolean): Boolean = {
  var flag = false

  def inner2(e: Int): Boolean = {     
    if (!flag) flag = inner(e)
    inner(e)
  }

  outer(x, p2)  
  flag
}

我可以避免使用 var 标志,而是使用 val insted 吗?据我了解 var 在 Scala 中是一种不好的风格

4

3 回答 3

1

return在 Scala 中,除非您使用关键字,否则将返回最后一个表达式。在您的情况下,该函数outer始终返回false.

由于您只是包装内部函数,因此您可以删除false

def outer(x: Int, inner: Int => Boolean): Boolean = {
  inner(x)
}

def inner(x: Int): Boolean = {
  if (x == 10) true else false
}

或者,甚至更短:

def inner(x: Int): Boolean = {
  x == 10
}

这将返回内部函数的返回表达式,即trueif x == 10, else false

于 2013-09-28T10:30:13.720 回答
1

如果你可以定义你的包装器,你可能可以避免使用var

def outerWrapper(x: Int, f: Int => Boolean): Boolean = {
    if (f(x)) true
    else outer(x, f)
}

然后你可以将inner方法传递给outerWrapper方法

outerWrapper(10,inner)
于 2013-09-28T10:44:25.853 回答
0

我的方法在这里:

import scala.util.control.Breaks
def outer(x: Int, inner: Int => Boolean): Boolean = {
  Breaks.breakable {
    inner(x)
    return false
  }
  true
}

def inner(x: Int): Boolean = {
  if (x == 10) Breaks.break()
  else false
}

println(outer(10, inner)) // TRUE!!
于 2019-03-01T01:43:56.477 回答