我认为下面的代码忠实地重现了您的代码。您创建一个Iterator
, 然后像任何其他迭代器一样循环。
case class Triangle(startx: Double, starty: Double, width: Double)
class drawSurroundingTrianglesIterator(original: Triangle) extends Iterator[Unit] {
private case class Iteration(old: Triangle, `new`: Triangle)
private var iteration = List(newIteration(original))
def hasNext = ! iteration.isEmpty
def next = {
iteration = iteration flatMap variants map newIteration
iteration map (_.old) foreach draw
iteration = iteration filter (_.`new`.width > 5)
}
private def newIteration(triangle: Triangle) = {
import triangle._
Iteration(triangle, Triangle(startx + width / 4, starty - width / 2, width / 2))
}
private def variants(iteration: Iteration) = {
import iteration._
import `new`._
List(Triangle(startx, starty, width),
Triangle(startx - width, old.starty + width, width),
Triangle(startx + width, old.starty + width, width))
}
private def draw(triangle: Triangle) = {
import triangle._
drawTriangle(startx, starty, width)
}
}
使用示例:
scala> new drawSurroundingTrianglesIterator(Triangle(100, 100, 40))
res1: drawSurroundingTrianglesIterator = non-empty iterator
scala> res1 foreach (x => x)
Drawing 110,000000, 80,000000, 20,000000
Drawing 90,000000, 120,000000, 20,000000
Drawing 130,000000, 120,000000, 20,000000
Drawing 115,000000, 70,000000, 10,000000
Drawing 105,000000, 90,000000, 10,000000
Drawing 125,000000, 90,000000, 10,000000
Drawing 95,000000, 110,000000, 10,000000
Drawing 85,000000, 130,000000, 10,000000
Drawing 105,000000, 130,000000, 10,000000
Drawing 135,000000, 110,000000, 10,000000
Drawing 125,000000, 130,000000, 10,000000
Drawing 145,000000, 130,000000, 10,000000
现在,正如var
它清楚地表明的那样,这是完全没有功能的。如果您想以迭代方式但功能性地执行此操作,则需要将“状态”作为参数传递给类似于next
正在执行的函数:
case class Triangle(startx: Double, starty: Double, width: Double)
case class Iteration(old: Triangle, `new`: Triangle)
object TriangleIterator {
def iterate(from: List[Iteration]) = {
val iteration = from flatMap variants map newIteration
iteration map (_.old) foreach draw
iteration filter (_.`new`.width > 5)
}
def newIteration(triangle: Triangle) = {
import triangle._
Iteration(triangle, Triangle(startx + width / 4, starty - width / 2, width / 2))
}
private def variants(iteration: Iteration) = {
import iteration._
import `new`._
List(Triangle(startx, starty, width),
Triangle(startx - width, old.starty + width, width),
Triangle(startx + width, old.starty + width, width))
}
private def draw(triangle: Triangle) = {
import triangle._
drawTriangle(startx, starty, width)
}
}
在这种情况下,我newIteration
公开了,因此您可以制作第一个。这是一个使用示例:
scala> List(TriangleIterator.newIteration(Triangle(100, 100, 50)))
res0: List[Iteration] = List(Iteration(Triangle(100.0,100.0,50.0),Triangle(112.5,75.0,25.0)))
scala> TriangleIterator.iterate(res0)
Drawing 112,500000, 75,000000, 25,000000
Drawing 87,500000, 125,000000, 25,000000
Drawing 137,500000, 125,000000, 25,000000
res1: List[Iteration] = List(Iteration(Triangle(112.5,75.0,25.0),Triangle(118.75,62.5,12.5)), Iteration(Triangle(87.5,12
5.0,25.0),Triangle(93.75,112.5,12.5)), Iteration(Triangle(137.5,125.0,25.0),Triangle(143.75,112.5,12.5)))
scala> TriangleIterator.iterate(res1)
Drawing 118,750000, 62,500000, 12,500000
Drawing 106,250000, 87,500000, 12,500000
Drawing 131,250000, 87,500000, 12,500000
Drawing 93,750000, 112,500000, 12,500000
Drawing 81,250000, 137,500000, 12,500000
Drawing 106,250000, 137,500000, 12,500000
Drawing 143,750000, 112,500000, 12,500000
Drawing 131,250000, 137,500000, 12,500000
Drawing 156,250000, 137,500000, 12,500000
res2: List[Iteration] = List(Iteration(Triangle(118.75,62.5,12.5),Triangle(121.875,56.25,6.25)), Iteration(Triangle(106.
25,87.5,12.5),Triangle(109.375,81.25,6.25)), Iteration(Triangle(131.25,87.5,12.5),Triangle(134.375,81.25,6.25)), Iterati
on(Triangle(93.75,112.5,12.5),Triangle(96.875,106.25,6.25)), Iteration(Triangle(81.25,137.5,12.5),Triangle(84.375,131.25
,6.25)), Iteration(Triangle(106.25,137.5,12.5),Triangle(109.375,131.25,6.25)), Iteration(Triangle(143.75,112.5,12.5),Tri
angle(146.875,106.25,6.25)), Iteration(Triangle(131.25,137.5,12.5),Triangle(134.375,131.25,6.25)), Iteration(Triangle(15
6.25,137.5,12.5),Triangle(159.375,131.25,6.25)))
scala> TriangleIterator.iterate(res2)
Drawing 121,875000, 56,250000, 6,250000
Drawing 115,625000, 68,750000, 6,250000
Drawing 128,125000, 68,750000, 6,250000
Drawing 109,375000, 81,250000, 6,250000
Drawing 103,125000, 93,750000, 6,250000
Drawing 115,625000, 93,750000, 6,250000
Drawing 134,375000, 81,250000, 6,250000
Drawing 128,125000, 93,750000, 6,250000
Drawing 140,625000, 93,750000, 6,250000
Drawing 96,875000, 106,250000, 6,250000
Drawing 90,625000, 118,750000, 6,250000
Drawing 103,125000, 118,750000, 6,250000
Drawing 84,375000, 131,250000, 6,250000
Drawing 78,125000, 143,750000, 6,250000
Drawing 90,625000, 143,750000, 6,250000
Drawing 109,375000, 131,250000, 6,250000
Drawing 103,125000, 143,750000, 6,250000
Drawing 115,625000, 143,750000, 6,250000
Drawing 146,875000, 106,250000, 6,250000
Drawing 140,625000, 118,750000, 6,250000
Drawing 153,125000, 118,750000, 6,250000
Drawing 134,375000, 131,250000, 6,250000
Drawing 128,125000, 143,750000, 6,250000
Drawing 140,625000, 143,750000, 6,250000
Drawing 159,375000, 131,250000, 6,250000
Drawing 153,125000, 143,750000, 6,250000
Drawing 165,625000, 143,750000, 6,250000
res3: List[Iteration] = List()