如何判断一个函数是否缺少参数或者它是否存在?

How to tell if a function is missing an argument or if it even exists?

我可能有一个愚蠢的问题。来自 Ruby 的背景,如果我忘记了一个方法的一些必需参数,解释器将抛出一个缺少参数的错误,我会知道这是一个小的快速错误。

因为我还是 Elixir 的新手,我会得到未定义的函数 Random.some_function/2 可能是 Random.some_function/3 被定义了,但我碰巧忘记了。

除了谷歌搜索或查看文档之外,还有更快捷的查找方法吗?只是好奇。

在 iex 终端中,您可以使用 h 关键字来显示所需功能的文档。这将适用于在语法中定义了 doc 或文档的所有函数。示例

h Enum.reduce

与 Elixir 不同,Ruby 不支持 Method overloading,并且在方法查找链中仅维护一个具有唯一名称的方法。因此,它可以指出与缺少参数相关的错误。

下面是一个 Ruby 示例,它表明当我们定义另一个具有相同名称的函数时,我们丢失了该函数的先前定义。

def test(param)
    p param
end

test() #=> wrong number of arguments (0 for 1) (ArgumentError)

def test(param_1, param_2)
    p param_1, param_2
end

test("A") #=> wrong number of arguments (1 for 2) (ArgumentError)

相反,在 Elixir 中,函数由其包含的模块、名称和参数唯一标识。两个同名不同元数的函数是两个不同的函数。下面是 one example:

defmodule Rectangle do
  def area(a), do: area(a, a)
  def area(a, b), do: a * b
end

IO.inspect Rectangle.area(2)      
#=> 4

IO.inspect Rectangle.area(2, 4)   
#=> 8

IO.inspect Rectangle.area()       
#=> ** (UndefinedFunctionError) undefined function: Rectangle.area/0

现在,如果你试图在没有任何参数的情况下调用 Rectangle.area,Elixir 只能抱怨 arity 为 0 的函数不存在,但它不可能弄清楚这两个 Rectangle.area 您打算调用的方法。可能是 Elixir IDE(将来)可以帮助解决这种情况,但目前,似乎必须查找 documentation/code 才能找出函数的正确数量。