我有什么
下面有一个功能(我无法更改外部功能)
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中是一种糟糕的风格
答案 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!!