2013-09-28 3 views
1

То, что яScala: сломать внешнюю функцию от внутренней функции

У меня есть функция ниже (я не могу изменить внешней функции)

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

То, что я хочу

inn э функция таким образом, что: если (х == 10) внешняя функция возвращает истинный

def inner(x: Int): Boolean = { 
    if (x == 10) OUTER_FUNCTION_SHOULD_RETURN_TRUE!!! 
    else false 
} 

outer(10, inner) // TRUE!! 

Вопрос

Как я могу это сделать?

Edit:

Я использую следующий трюк:

// 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, но использовать Вэл Insted? Как я понимаю, var - это плохой стиль в Scala.

+0

Насколько я знаю, вы не можете сделать что без изменения 'внешней' функции! – Shrey

+0

Также, если это не внешнее (10, внутреннее) // TRUE !! '? – 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

Я знаю, но я не могу chanhe внешнюю функцию –

+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 моего вопроса –

Смежные вопросы