我很感激这方面的一些帮助,这是我第一次尝试用Elixir做它而且它让我失望。
所以我的目的是一遍又一遍地从STDIN中捕获,将用户输入解析为数字。当用户最终点击输入而不输入数字时,他们将获得到目前为止输入的所有数字的总和。简单。
所以这就是我的计划方式:
defmodule Solution do
def main, do: scan(IO.read :line)
def scan(line), do: scan(IO.read :line, Integer.parse line)
def scan("\n", total), do: IO.puts(total)
def scan(line, {total, _}) do
final_total = Integer.parse(line) + Integer.parse(total)
next_line = IO.read :line
scan(next_line, final_total)
end
end
Solution.main
逐行:
def main, do: scan(IO.read :line)
首先,从stdin调用scan
一行。
def scan(line), do: scan(IO.read :line, Integer.parse line)
如果我们使用单个参数进行scan
调用,则将该参数解析为整数,并将其与下一个stdin行传递给scan/2
。
def scan("\n", total), do: IO.puts(total)
如果我们在stdin行为空的情况下进行scan/2
调用,则只输出第二个参数,即整数total
。
然后最后
def scan(line, {total, _}) do
final_total = Integer.parse(line) + Integer.parse(total)
next_line = IO.read :line
scan(next_line, final_total)
end
我们从stdin得到一行,一个整数和一些垃圾的元组。当前总数是该行(解析为int)加上之前的总数。我们再次使用stdin的新行和我们最新的总数调用scan/2
。
所有的逻辑似乎都适合我。但我得到(FunctionClauseError) no function clause matching in IO.read/2
。 Elixir的错误消息不是超级描述性的,所以我无法解决这个问题。我究竟做错了什么?
答案 0 :(得分:2)
这里最大的提示是2
中的(FunctionClauseError) no function clause matching in IO.read/2
。您正在调用IO.read
的2个版本而不是1(带有参数:line
和Integer.parse line
),这是您最有可能的。这是因为您在第3行的IO.read
参数周围缺少一对括号:
def scan(line), do: scan(IO.read :line, Integer.parse line)
应该是:
def scan(line), do: scan(IO.read(:line), Integer.parse line)
当你对它们进行嵌套时,在所有函数调用(至少是带有参数的函数)周围都有括号,这也被认为是更惯用的:
def scan(line), do: scan(IO.read(:line), Integer.parse(line))
由于Solution.scan
和IO.read
都有1个和2个arity版本,因此这里的错误不太明显(比如编译失败)。