Elixir案例陈述和模式匹配

时间:2017-04-23 15:07:17

标签: pattern-matching elixir case-statement

我正在尝试将带有墙壁的房间画成%{{x, y} => [items]}的地图,我正在使用案例陈述来确定我想要绘制的墙类型。

然而,它尝试进行模式匹配并将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

你会怎么写这个?

1 个答案:

答案 0 :(得分:4)

您无法在模式中插入任意表达式。您必须将计算移到外面并使用pin运算符,或者如果它是简单算术,您也可以使用create table #yourproductid(productid int) insert into #yourproductid (productid) values (68),(74),(58),(64),(67) 的守卫。

搬到外面:

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 并在那里进行相等检查,这样您就不必使用pin运算符到处或在外面声明局部变量:

cond