Ruby에서 순수하게 OO 방식으로 이진 트리 미로 생성을 구현했습니다. 나는 이것을 Elixir에서 학습 연습으로 다시 쓰려고 노력하고 있지만, OO 대 FP 패러다임에 대한 몇 가지 문제가있다.Elixir의 이진 트리 미로 생성
셀을 포함하는 표를 렌더링합니다. 이진 트리 알고리즘을 사용하여 격자를 통과 할 때 모든 셀에 대해 북쪽 또는 동쪽 셀과 연결하기로 결정합니다. Ruby 구현에서이 연결은 양방향입니다.
def link(cell, bidirectional=true)
@links[cell] = true
cell.link(self, false) if bidirectional
self
end
def unlink(cell, bidirectional=true)
@links.delete cell
cell.unlink(self, false) if bidirectional
self
end
그래서이 링크는 셀을 인접 항목에 연결하고 인접 항목을 셀에 연결합니다. 나는 엘릭서에서 이것을 어떻게하는지 알아낼 수 없다. 함수의 첫 번째 부분이 아래로 있습니다.
def link(cell, neighbour, bidirectional) do
%{ cell | links: cell.links ++ [neighbour]}
end
test "it links cells in a bidirectional way" do
cell = Cell.create(1, 1)
neighbour = Cell.create(2, 2)
%{ row: _, column: _, links: cell_links } = Cell.link(cell, neighbour, true)
assert Enum.member? cell_links, neighbour
# ?? check if neighbour links includes cell, but cannot get a reference to "new" neighbour
end
그러나 양방향 호출로 인해 문제가 발생합니다. 문제없이 호출 할 수 있지만 불변의 데이터를 다루고 있기 때문에 정확한 링크 배열을 가진 "새로운"이웃 셀에 대한 참조를 얻을 수는 없습니다.
모든 셀에 대해 GenServer를 구현하는 것은 나에게 반 패턴과 비슷합니다. 순전히 기능적인 방법으로이 동작을 구현하는 방법이 반드시 있어야합니다. 나는 FP에 익숙하지만 도움을 많이 원합니다.