Scala:将外部函数与内部函数断开

Scala:将外部函数与内部函数断开,scala,Scala,我拥有的 我下面有一个函数(我不能更改外部函数) 我想要什么 以如下方式定义内部函数: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,

我拥有的

我下面有一个函数(我不能更改外部函数)

我想要什么

以如下方式定义内部函数: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中是一种糟糕的样式,在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
}

这将返回内部函数的返回表达式,即如果
x==10
,则返回
true
,否则返回
false
,如果可以定义包装器,则可能可以避免使用
var

def outerWrapper(x: Int, f: Int => Boolean): Boolean = {
    if (f(x)) true
    else outer(x, f)
}
然后您可以将
internal
方法传递给
outerrapper
方法

outerWrapper(10,inner)
我的方法是:

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!!

据我所知,如果不更改
outer
功能,您就无法做到这一点!另外,它不应该是
outer(10,internal)//TRUE?首先,这看起来像是Coursera课程中的家庭作业,所以给你一个完整的解决方案是不合适的。这就是说,关于编写
的提示是存在的(如果我正确理解了这个问题,那么你最终会被卡住):不要对所有的
重复使用
——你只需要检查集合中的条目,直到找到匹配项,因此,编写一个尾部递归内部方法,它将以这种方式工作。进一步提示:假设您正在寻找偶数-如果集合中没有偶数,那么对于集合中的所有元素,什么必须为真?您应该发现,
存在的最简单的解决方案实际上是一个单行程序。您只是不想将它们泄漏到函数或类的外部。你只需要确保你了解你的应用程序是否有漏洞。仅在本地和需要时使用mutable。我知道,但我无法更改外部函数。如果另一个函数与您发布的函数非常相似,那么它将始终返回false,因为返回最后一个表达式(
false
)。你对此无能为力。我可以避免使用var,而改用val吗?
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!!