Scala:从内部函数中打破外部函数

时间:2013-09-28 10:19:31

标签: scala

我有什么

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

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

我想要什么

以下列方式定义内部函数:if(x == 10) outer 函数返回 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中是一种糟糕的风格

3 个答案:

答案 0 :(得分:1)

在Scala中,除非使用return关键字,否则将返回最后一个表达式。在您的情况下,函数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
}

这将返回内部函数的返回表达式,即true x == 10,否则为false

答案 1 :(得分:1)

如果您可以定义包装器,则可以避免使用var

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

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

outerWrapper(10,inner)

答案 2 :(得分: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!!