2013-09-28 40 views
1

我有什么斯卡拉:从内部功能突破外功能

下面我有一个功能(我不能改变功能)

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

我想要什么

定义inn呃功能这样的方式:如果(X == 10)函数返回真正

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

据我所知,你不能这样做不改变'外部'功能! – Shrey

+0

另外,它应该不是'外(10,内)//真?!!? – Shrey

+0

thnks,已经正确 –

回答

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

+0

我知道,但我无法搜索外部函数 –

+0

如果其他函数看起来像您发布的函数,那么它将始终返回false,因为返回了最后一个表达式('false')。你无能为力。 – David

+0

请参阅我的问题的编辑部分 –

1

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

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

那么你可以传递inner方法outerWrapper方法

outerWrapper(10,inner) 
+0

是的,你是对的,但看到我的问题的edit2部分 –