编程灵药书后,在列表清单上遇到问题

时间:2016-11-24 08:01:04

标签: 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个事项列表的正确模式。我怎样才能做到这一点?我认为这部分超出了练习和课程材料的范围,但我很难弄明白。

  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"

1 个答案:

答案 0 :(得分:3)

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个点击第二个匹配子句,然后点击一下< em>第一个匹配子句。如果您在评论中指定了一个传递smth,那么第二个子句将有1个命中,并且第三个子句的 ,因为既不是第一个也不是第二个匹配。

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