编译模块警告

时间:2016-08-09 07:04:13

标签: elixir

在尝试编译Elixir模块(使用Elixir 1.3.2和Erlang R19)时,我得到了我认为是一个相当奇怪的警告。代码来自书籍Introducing Elixir

defmodule Drop do
    def fall_velocity(distance) do
        :math.sqrt(2 * 9.8 * distance)
    end

    def fall_velocity(distance, gravity \\ 9.8) do
        :math.sqrt(2 * gravity * distance)
    end
end

当我编译它时,shell说:

warning: this clause cannot match because a previous clause at line 2 always matches
  drop.ex:6

第6行是第二个函数定义,第2行是第一个。

但是,当我使用代码时,它可以正常工作:

iex(12)> Drop.fall_velocity(20)     
19.79898987322333
iex(13)> Drop.fall_velocity(20, 1.6)
8.0
那么,那个警告的含义是什么?

1 个答案:

答案 0 :(得分:3)

问题在于def fall_velocity(distance, gravity \\ 9.8) do将定义2个函数,一个具有arity 1,只落入arity 2版本,重力设置为9.8,一个具有arity 2.在这种情况下,您不需要第一个条款。第二个默认情况下将重力设置为9.8,您将获得与arity 1相同的答案。

defmodule Drop do
  def fall_velocity(distance, gravity \\ 9.8) do
    :math.sqrt(2 * gravity * distance)
  end
end