Scala の標準ライブラリのいくつかのメソッドが可変状態で実装されているのはなぜですか?
たとえば、クラスfind
の一部としてのメソッドは次のように実装されます。scala.Iterator
def find(p: A => Boolean): Option[A] = {
var res: Option[A] = None
while (res.isEmpty && hasNext) {
val e = next()
if (p(e)) res = Some(e)
}
res
}
@tailrec
これは、おそらく次のようなメソッドとして実装できた可能性があります
def findNew(p: A => Boolean): Option[A] = {
@tailrec
def findRec(e: A): Option[A] = {
if (p(e)) Some(e)
else {
if (hasNext) findRec(next())
else None
}
}
if (hasNext) findRec(next())
else None
}
ここで、1 つの引数が変更可能な状態の使用である可能性があり、ループがより効率的である可能性があると思います。これは、当然のことながら、ライブラリ コードでは非常に重要ですが、 'd メソッドwhile
の場合は本当にそうなのでしょうか?@tailrec