测试Elixir中的十进制数据类型?

时间:2017-04-24 20:24:55

标签: elixir

Elixir Decimal包中是否有等效的is_string,is_number,is_integer,is_binary?

如果没有,为Decimal进行模式匹配的方法是什么?

1 个答案:

答案 0 :(得分:5)

Decimal是一个Elixir结构。因此,您可以使用%Decimal {}进行匹配。这可以添加到您的函数子句或case语句中。以下是几个例子:

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

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

相同的方法适用于匹配任何Elixir结构。匹配规则类似于maps。但是,结构只包含它们定义的字段,并且所有这些字段都存在于结构中。

这意味着您无法匹配存在的文件必须在默认值上完成。例如:

# 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