Elixir 没有function子句,尽管看起来确实有?

Elixir 没有function子句,尽管看起来确实有?,elixir,Elixir,我非常感谢你的帮助,这是我用长生不老药做的第一件事,它让我感到很不舒服 所以我的目的是一遍又一遍地从STDIN中捕获,将用户输入解析为数字。当用户最终点击enter而不输入数字时,他们会得到迄今为止输入的所有数字的总和。简单 下面是我的计划: defmodule Solution do def main, do: scan(IO.read :line) def scan(line), do: scan(IO.read :line, Integer.parse line) def sc

我非常感谢你的帮助,这是我用长生不老药做的第一件事,它让我感到很不舒服

所以我的目的是一遍又一遍地从STDIN中捕获,将用户输入解析为数字。当用户最终点击enter而不输入数字时,他们会得到迄今为止输入的所有数字的总和。简单

下面是我的计划:

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)
首先,调用
scan
从stdin传入一行

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)加上上上一个总计。我们再次调用
scan/2
,其中有一行来自stdin的新行和我们最新的总数


所有的逻辑似乎对我都适用。但是我在IO.read/2中没有得到匹配的函数子句。Elixir的错误消息不是超级描述性的,所以我很难解决这个问题。我到底做错了什么?

这里最大的提示是
(FunctionClauseError)中的
2
,IO.read/2中没有匹配的函数子句。您调用的是IO.read的2个算术版本,而不是1(参数为
:line
Integer.parse line
),这很可能是您想要的。这是因为在
IO的参数周围缺少一对括号。请阅读第3行中的

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版本。

噢,该死,我完全忽略了这一点,这完全有道理。谢谢你,多伯特,谢谢你。