2016-03-21 6 views
4

Gibt es eine Möglichkeit, die Rückgabetypspezifikation einer Funktion in einer anderen Funktionsspezifikation zu referenzieren?Geben Sie einen Verweis auf eine Elixier-Funktion @spec in einer anderen Dekorationsfunktion an @spec

defmodule Car do 
    @spec beep(none()) :: String.t 
    def beep do 
    "beep" 
    end 

    @spec beep_log(none()) :: String.t 
    def beep_log do 
    IO.puts "beep log" 
    beep 
    end 
end 

Kann die Spezifikationen für beep_log in etwa wie folgt angegeben werden:

@spec beep_log(none()) :: beep() 
+0

I zu Art Referenzen wie '@return verpasst (siehe foo)' in YARD, aber es gibt einen guten Grund, das nicht zu unterstützen: es sein kann, Häufig sind zirkuläre Abhängigkeiten von Eingabe- und Rückgabetypen aufgrund von 'foo_to_bar'- und' bar_to_foo'-Konvertierungsfunktionen. Viele Male in Elixir sind diese Funktionen in verschiedenen Modulen wie 'Foo.to_bar' und' Bar.to_foo', was bedeutet, dass es ein Kompilierauftragsproblem werden würde. –

Antwort

6

Keine Weise zu tun, dass neue Daten ohne zu definieren, geben Sie, dass beide Funktionen zurück. Sie können ein Beispiel dieses Musters in der docs for the GenServer module sehen, wo ein on_start Typ von und start_link/3 definiert und freigegeben ist.

In Ihrem Fall, so etwas wie dies funktionieren würde:

defmodule Car do 
    @type beep_return() :: String.t 

    @spec beep(none()) :: beep_return() 
    def beep do 
    "beep" 
    end 

    @spec beep_log(none()) :: beep_return() 
    def beep_log do 
    IO.puts "beep log" 
    beep 
    end 
end