線形シーケンスの場合、find
は常に線形に進むため、常に同じ要素が返されます。
これは、Set
のような非線形コレクションでは必ずしも真ではありません。
Set(1 to 5: _*).find(_ < 6) // Some(5)
Set(1 to 5: _*).find(_ < 6) // Some(5)
ここでは、値の平等のために実装が決定的であるように見えますが、ここでは別の要素があります。この等式は簡単に分けることができます
:
// reference equality
class Box(val peer: Int) { override def toString = peer.toString }
def mkIndet() = Set((1 to 5).map(new Box(_)): _*)
mkIndet.find(_.peer < 6) // "random"
mkIndet.find(_.peer < 6) // "random"
mkIndet.find(_.peer < 6) // "random"
別のケースでは、並列コレクションです:
def par() = (1 to 10000).par.find(i => i % 1000 == 0)
par() // "random"
par() // "random"
par() // "random"
あなただけのランダムな値を返す述語を使用することができますか?または、あなた自身を純粋な述語関数に限定したいですか? – Bergi
変更可能なコレクションを使用し、 'find'実行間で変更しますか?ボーナスポイントは、別のスレッドから行います。 – Bergi
これらの提案は間違いなく 'find'の結果を変更しますが、それは私が探していたものとはまったく異なります。私は 'collection.find(predicate)'が変わらないコレクションと述語で異なる結果を返すかどうか疑問に思っていました。例えば、findが非決定的にトラバースするコレクションオブジェクトがあれば? – Shuklaswag