2016-08-09 9 views
2

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?

Antwort

3

Das Problem ist, dass def fall_velocity(distance, gravity \\ 9.8) do 2 Funktionen definieren wird, eine mit Arity 1, die nur die Arity 2-Version mit Schwerkraft auf 9,8 fällt, und eins mit Arity 2. In diesem Fall brauchen Sie nicht die erste Klausel überhaupt. Der zweite wird die Schwerkraft auf 9,8 voreingestellt, und Sie werden die gleiche Antwort wie arity 1.

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

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

+0

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

+1

Ja, der zweite erzeugte eine 1-arity-Funktion, die aufgrund der ersten von Ihnen definierten Funktion niemals übereinstimmen konnte. – Dogbert

Verwandte Themen