Ich bekomme, was ich für eine ziemlich seltsame Warnung halte, wenn ich versuche, ein Elixir-Modul zu kompilieren (mit Elixir 1.3.2 und Erlang R19). Der Code ist aus dem Buch Introducing Elixir
:Warnung zum Kompilieren des Moduls
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
Wenn ich es kompilieren, die Shell sagt:
warning: this clause cannot match because a previous clause at line 2 always matches
drop.ex:6
Line 6 ist die zweite Funktionsdefinition und Linie 2 ist die erste.
Allerdings, wenn ich den Code verwenden, funktioniert es gut:
iex(12)> Drop.fall_velocity(20)
19.79898987322333
iex(13)> Drop.fall_velocity(20, 1.6)
8.0
Was ist dann die Bedeutung dieser Warnung?
Hey, nochmals vielen Dank für die Beantwortung bekommen! Also, in meinem Code war die zweite Funktion eine Art Schatten des ersten? Wenn nicht, warum hat die Shell gesagt, dass Zeile 2 immer übereinstimmen wird? – dotslash
Oh, vielleicht war die Warnung, weil die neue Funktion zwei Klauseln erzeugte, von denen die erste durch die vorher definierte Funktion beschattet wurde. Das könnte es erklären ... – dotslash
Ja, der zweite erzeugte eine 1-arity-Funktion, die aufgrund der ersten von Ihnen definierten Funktion niemals übereinstimmen konnte. – Dogbert