1

私が持っているもの

以下の関数があります(外側の関数は変更できません)

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

私が欲しいもの

次のように内部関数を定義します。 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, 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の悪いスタイルです

4

3 に答える 3

1

ラッパーを定義できる場合は、おそらく使用を避けることができますvar

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

inner次に、メソッドをouterWrapperメソッドに渡すことができます

outerWrapper(10,inner)
于 2013-09-28T10:44:25.853 に答える
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!!
于 2019-03-01T01:43:56.477 に答える