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

関連する問題