2013-09-28 80 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部分 –