2017-04-24 4 views
1

Gibt es ein Äquivalent von is_string, is_number, is_integer, is_binary für das Elixir Decimal-Paket?Testen auf Dezimaldaten in Elixir?

Wenn nicht, was sind einige der Möglichkeiten, Muster für ein Dezimalsystem zu finden?

Antwort

4

Decimal ist eine Elixir-Struktur. Sie können also mit% Dezimal {} übereinstimmen. Dies kann zu Ihrer Funktionsklausel oder in Fallanweisungen hinzugefügt werden. Hier sind paar Beispiele:

def add(%Decimal{} = x, %Decimal{} = y), do: Decimal.add(x, y) 

case num do 
    %Decimal{} = x -> # ... 
    num when is_integer(num) -> # ... 
    _ -> # default case 
end 

Der gleiche Ansatz gilt für den Abgleich einer Elixir-Struktur. Die Übereinstimmungsregeln sind ähnlich wie maps. Eine Struktur enthält jedoch nur die Felder, mit denen sie definiert sind, und alle diese Felder sind in der Struktur vorhanden.

Dies bedeutet, dass Sie bei Vorhandensein einer Datei nicht übereinstimmen können auf den Standardwert vorgenommen werden. Zum Beispiel:

# to match a struct that contains the `:mode` key you can do this: 

def my_fun(%{mode: _}), do: # matches if the :mode key is present 
def my_fun(%{}), do: # default case when map does not contain the :mode key 

# to do the same with a struct 

def MyStruct do 
    defstruct mode: nil, other: true 
end 

def my_fun(%MyStruct{mode: mode}) when not is_nil(mode), do: # do something with mode 
def my_fun(%MyStruct{}), do: # default case when mode is nil