命令的および機能的な方法で実装されたメソッドがあります(ここで最善を尽くしました)。このメソッドは ArrayBuffer[Creature] を反復処理し、各クリーチャーまでの距離を計算し、最も近いものまたは None を返します (「これ」以外のクリーチャーがワールドに存在しない場合)。
必須:
private def closestEnemy: Option[Creature] = {
var closest: Option[Creature] = None
var distanceToClosest = Int.MaxValue
for(creature <- game.creatures if creature != this) {
val distance = distanceTo(creature)
if(distance < distanceToClosest) {
closest = Some(creature)
distanceToClosest = distance
}
}
closest
}
機能:
private def closestEnemy: Option[Creature] =
game.creatures filter { _ != this } map { creature => (creature, distanceTo(creature)) } match {
case creaturesWithDistance if creaturesWithDistance.isEmpty => None
case creaturesWithDistance => Some(creaturesWithDistance minBy { _._2 } _1)
}
機能コードはあまり明白ではないように見えます (おそらく単純化できますが、方法はわかりません)。1 か月でその場で読むことができるかどうかはわかりません。私の質問は、習慣の問題ですか、それともこの特定のケースには機能的ではありませんか? Scalaを始めたとき、あなたはそのような疑問を持っていましたか? しばらくすると、機能的スキルが大幅に向上し、命令型アプローチを完全に打ち負かしましたか? 体験談を投稿してください。
ありがとう!