在尝试编译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
那么,那个警告的含义是什么?
答案 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