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