Elixir case 语句和模式匹配
Elixir case statement and pattern matching
我正在尝试将有墙的房间绘制成 %{{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
你会怎么写这个?
您不能在模式中插入任意表达式。您必须将计算移到外面并使用 pin 运算符,或者如果它是简单的算术,您也可以使用带有 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
并在那里进行相等性检查,这样您就不必在任何地方都使用 pin 运算符或在外部声明局部变量:
cond do
pos == {from_x, from_y} -> ...
pos == {from_x, from_x + size_x} -> ...
...
end
我正在尝试将有墙的房间绘制成 %{{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
你会怎么写这个?
您不能在模式中插入任意表达式。您必须将计算移到外面并使用 pin 运算符,或者如果它是简单的算术,您也可以使用带有 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
并在那里进行相等性检查,这样您就不必在任何地方都使用 pin 运算符或在外部声明局部变量:
cond do
pos == {from_x, from_y} -> ...
pos == {from_x, from_x + size_x} -> ...
...
end