elixir - 遵循编程 Elixir 书,在列表列表上的守卫方面遇到问题

标签 elixir

在书中,作者使用了一些test_data:

def test_data do
    [
     [1366225622, 26, 15, 0.125],
     [1366225622, 27, 15, 0.45],
     [1366225622, 28, 21, 0.25],
     [1366229222, 26, 19, 0.081],
     [1366229222, 27, 17, 0.468],
     [1366229222, 28, 15, 0.60],
     [1366232822, 26, 22, 0.095],
     [1366232822, 27, 21, 0.05],
     [1366232822, 28, 24, 0.03],
     [1366236422, 26, 17, 0.025]
    ]
  end

我在进行模式匹配以确保 test_data 始终遵循包含 4 件事的列表的正确模式时遇到问题。我怎样才能做到这一点?我认为这部分超出了练习和类(class) Material 的范围,但我正在努力弄清楚。

  def for_loc([], _), do: IO.puts "Please provide valid data and location number!"
  def for_loc([head = [time, loc_id, temp, rain] | tail], loc), do: IO.puts "Valid"

最佳答案

iex(1)> defmodule B do
...(1)>   def for_loc([], _), do: IO.puts "Valid!"
...(1)>   def for_loc([[time, loc_id, temp, rain] | tail], loc), do: for_loc(tail, loc)
...(1)>   def for_loc(_, _), do: IO.puts "Invalid!"
...(1)> end

问题是:当您使用递归时,最后一次匹配将针对 for_loc([], _) (最后一次迭代的列表为空。)

什么是无效的,应该用单独的匹配子句来处理,如果之前没有人被击中,那么就会被击中。

也就是说,当数组元素与[time, loc_id, temp, rain]不匹配时,第二个子句将不匹配而第三个子句将匹配

旁注:我不知道 loc (第二个参数)是什么,但你的 test_data 根本不提供它,因此我决定默默地保持原样。


模式详细信息:当将 test_data 传递给 for_loc 时,第二个匹配子句将有 10 次命中,然后 1 次命中 first 匹配子句。当一个像您在评论中指定的那样传递时,第二子句将有1次命中,并且命中第三个​​子句,因为第一个和第二个都不匹配。

此处使用递归,直到列表为空或无效为止。

关于elixir - 遵循编程 Elixir 书,在列表列表上的守卫方面遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40780861/

相关文章:

TCP 服务器没有响应

binary - 将 0 和 1 的二进制字符串转换为 Elixir 中的位串

elixir - 将数据注入(inject) Phoenix 的 Action 参数

elixir - String.replace 分组,整数与替换模式冲突

elixir - 如何在 Elixir 中按 map 值对 map 列表进行排序?

elixir - 列表包含另一个顺序相同的列表

elixir - 是否可以在 Enum.each 中有 ExUnit.test 语句

json - 将 json 作为文本 Elixir 写入文件

Ecto 'where and where' 子句

regex - Regex.compile/2不区分大小写的选项