2014-05-13 32 views
7

C# gibi jeneriklerle statik olarak yazılan dillerde, harita imzasında her bir haritanın anahtarlarının bir atom olduğunu ve her bir değerin {string, int} listesi olduğunu belirtebilirim tanımlama grubu. Elixir'de olduğu gibi işlev argümanlarının tür özelliklerini nasıl tanımlarım?elixir: map/hashdicts için tanımlayıcı tür belirtimi

Not: Bunu okuyorsanız ve> 1500 dereceye sahipseniz, lütfen bir özellik belirtimi etiketi oluşturabilirsiniz.

+0

, ancak genellikle resmi bir sisteme sahip olmadığı anlamına gelen "dinamik bir dil" olduğunu iddia eder. Yani ... yorum kullan? – luqui

+4

sadece emin olmak için, statik analiz aracı Dialyzer - http://elixir-lang.org/docs/stable/Kernel.Typespec.html – tldr

cevap

12

Öyle şöyle tanımlıyoruz olacaktır:

@type bar :: %{atom => [{binary, integer}]} 

@spec foo(bar) :: bar 
def foo(bar), do: bar 

yukarıdaki ikili/tamsayı dizilerini listelerine atom tuşlarının sizin haritasıdır yeni bir tür tanımlar ve ardından tip spec o türünü kullanan foo.

+0

tarafından kullanılabilecek tip özellikleri vardır, bunu bir tür olarak belirtmek zorundayım önceden, sadece satır içi yapamam? Öyleyse, tüm özel türlerimi ayrı bir modülde tutmalı ve birden çok modülde tip tanımının kopyalanmasını önlemek için bunları içe aktarmalı mıyım? – tldr

+2

Kesinlikle satır içi yazabilirsiniz, ancak hepsi birden çok karmaşık türde varsa, bunu okumak zor. Aynı zamanda, sadece yapısının değil, türün ne olduğu hakkında biraz daha açık bir ifadedir. Diğer modüllerdeki türleri tanımlayabilir ve bunları 'Module.type_name' üzerinden kullanabilirsiniz. – bitwalker

+0

harika, teşekkürler! Bu anlamda, Elixir'in statik analizi Go'lardan daha ayrıntılıdır, çünkü Go özel türlerinizi argüman olarak alan işlevleri tanımlamanıza izin vermez. (Gitme özelliğini kullanmadıysanız göz ardı edin) – tldr

1

satır içi spec için bu böyle gider:

defmodule LousyCalculator do 
    @spec add(number, number) :: {number, String.t} 
    def add(x, y), do: {x + y, "You need a calculator to do that?!"} 

    @spec multiply(number, number) :: {number, String.t} 
    def multiply(x, y), do: {x * y, "Jeez, come on!"} 
end 

bir yapı daha sonra türüdür bekliyorsanız:

@spec struct_returner_and_getter(%Struct_name1{}) :: %Struct_name2{} 

Kaynak: Ben iksir aşina değilim http://elixir-lang.org/getting-started/typespecs-and-behaviours.html