2016-03-21 14 views
4

Başka işlev özelliklerinde bir işlevin dönüş türü belirtimine başvurmanın bir yolu var mı?Başka bir dekorasyon işlevinde @spec bir Elixir işlevine bir başvuru belirtin @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 

beep_log için gözlük böyle bir şey belirtilebilir Can:

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

Ben de YARD içinde @return (foo bakınız) '' gibi tip referanslar cevapsız, ama bu desteklemeyen için iyi bir nedeni var: o olabilir "foo_to_bar" ve "bar_to_foo" dönüşüm işlevleri nedeniyle girdi ve dönüş türlerinin dairesel bağımlılıkları vardır. Elixir'de bir çok kez bu fonksiyonlar, 'Foo.to_bar' ve 'Bar.to_foo' olarak farklı Modüllere sahiptir, yani bir derleme sırası sorunu olur. –

cevap

6

tanımlayan olmadan yeni veriler her iki işlevleri döneceğini yazın bunu yolu yok. Bu örüntüün bir örneğini,türününtüründe tanımladığı ve start/3 ve start_link/3 tarafından paylaşıldığı docs for the GenServer module içinde görebilirsiniz. Senin durumunda

, böyle bir şey çalışacak:

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 
İlgili konular