나는 코드를 생각한다 아래는 코드를 충실하게 재현 한 것입니다. 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)
}
}
사용 예 : 분명히에서 var
와 같이
이
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
이제이 완전히 비 기능입니다.당신이 반복적으로 그것을 할 싶어하지만 기능적으로, 당신은 무엇 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()
그럼 궁금한 점은 무엇입니까? – sanity
이 함수를 반복자로 반복 할 수 있도록이 함수를 어떻게 변경합니까? –
"함수 프로그래밍 스타일에서 ..."... "재귀가 없음". 그런데 "나는 관용적 인 OOP 스타일로 쓰길 원하지만 어떤 수업도 듣고 싶지 않다"고 말하는 것이 아닌가? – Juliet