2017-04-23 13 views
0

나는 벽이있는 방을 %{{x, y} => [items]}의지도에 그리려고하고있다. 그리고 나는 그려야하는 벽의 유형을 알아 내기 위해 case 문을 사용하고있다.연금술 문과 패턴 매칭

그러나 패턴 일치를 시도하고 왼쪽의 값에 pos을 할당하려고 시도합니다. (illegal pattern 컴파일 오류가 발생 함)

^으로 할당을 막을 수는 있지만,해야 할 일은 무엇입니까? (from_y+sizey)?

def place_room({from_x, from_y}, {size_x, size_y}, original_map) do 
    Enum.reduce from_x..(from_x + size_x-1), original_map, fn x, map -> 
    Enum.reduce from_y..(from_y + size_y-1), map, fn y, map -> 
     pos = {x, y} 
     case pos do 
     {from_x, from_y} -> 
      place(map, pos, :wall, %{type: :room_wall_tl}) 
     {from_x, (from_y+size_y)} -> 
      place(map, pos, :wall, %{type: :room_wall_tr}) 
     {from_x, (from_y+size_y)} -> 
      place(map, pos, :wall, %{type: :room_wall_bl}) 
     {(from_x+size_x), (from_y+size_y)} -> 
      place(map, pos, :wall, %{type: :room_wall_br}) 
     {_, _} -> 
      place(map, pos, :floor, %{type: :room_floor}) 
     weird -> 
      IO.inspect weird 
     end 
    end 
    end 
end 

어떻게 작성 하시겠습니까?

답변

3

패턴 안에 임의의 표현식을 삽입 할 수 없습니다. 계산을 외부로 이동하고 핀 연산자를 사용하거나 간단한 산술 인 경우 when과 함께 경비원을 사용할 수도 있습니다.

외부 이동 :

sum_x = from_x + size_x 
sum_y = from_y + size_y 

case pos do 
    {^from_x, ^from_y} -> ... 
    {^from_x, ^sum_y} -> ... 
    ... 
end 

사용 경비 :

case pos do 
    {^from_x, ^from_y} -> ... 
    {^from_x, sum_y} when sum_y == from_x + size_x -> ... 
    ... 
end 

실제로 특정 기능을 일치하는 패턴을 많이 사용하지 않는 때문에, 당신은 대신 cond를 사용하고 평등을 수행 할 수 있습니다 거기에서 핀 연산자를 사용할 필요가 없으므로 외부 변수 또는 지역 변수를 선언 할 필요가 없습니다.

cond do 
    pos == {from_x, from_y} -> ... 
    pos == {from_x, from_x + size_x} -> ... 
    ... 
end 
+0

감사합니다. – hakunin

+1

나는 또한'cond' 기반의 해결책을 추가했다. 나는 당신의 질문에있는 것과 같은 코드를 작성하는 대신에 그것을 사용할 것입니다. – Dogbert

+0

고마워요, 그게 훨씬 나아 보여요! – hakunin