2015-09-24 2 views
5

:あなたが持っている場合、これが発生する可能性がスカラ:述語が例外保持していないこの例外はScalaでどういう意味

java.util.NoSuchElementException: Predicate does not hold for ... 
+1

それは理解のために使われていますか? –

+0

実際、そうです、理解の内部のステートメントの1つの中で起こるように見えます。 – automorphic

+2

完全なエラーとコードを貼り付けることはできますか? –

答えて

4

それはscala.util.Try

scala.util.Try(2).filter(_ < 0) // Failure(java.util.NoSuchElementException: Predicate does not hold for 2) 



    for { 
    v <- scala.util.Try(2) 
    if v < 0 
    } yield v // Failure(java.util.NoSuchElementException: 
に固有の
6

一つの方法があるため、理解述語で試し組み合わせ(if声明) :トライの

for { 
    x <- Try(expr) if booleanExpr 
} { 
    ... 
} 

filter方法はbooleanExprfalseと評価された場合、ループ本体をスキップするjava.util.NoSuchElementExceptionを投げることができます。 @Guillaumeはコメントで指摘するように、その例外の

reasonフィールドが「述語がために保持していない...」され

を、それがfilterを実装方法により、これを原因としてみの実装です - あなたはfor comprehension内(IF)条件を使用する場合、コンパイラによって呼ばれています方法:

if (p(value)) this 
else Failure(new NoSuchElementException("Predicate does not hold for " + value)) 
+1

その情報源を指定してください。私の知る限りでは、 'のために' 'が' withFilter'に移植されています。ループ本体をスキップするために 'NoSuchElementException'を投げたことについて聞いたことはありません。 – Aivean

+2

@Aivean https://github.com/scala/scala/blob/2.11.x/src/library/scala/util/Try.scala#L241 –

+0

@GuillaumeMassé、わかりました。ブレント氏の答えは、これが「理解」と関連しているという誤った印象を与えたが、それはすべて「試みる」の「フィルター」に関するものだ。 – Aivean

関連する問題