Elixir is_range守卫没有定义?我该怎么用?

Jos*_*itt 10 elixir

我想用一名is_range()后卫.例如:

def foo(bar) when is_range(bar) do
    # stuff
end
Run Code Online (Sandbox Code Playgroud)

is_range不存在?我正在使用Elixir 1.0.5

我试过了

def foo(bar) when Range.range?(bar) do
    # stuff
end
Run Code Online (Sandbox Code Playgroud)

但这也行不通.

我该怎么办?

Fre*_*Dog 17

您可以在警卫中使用的功能类型非常有限.

http://elixir-lang.org/getting-started/case-cond-and-if.html

范围是一个结构,它是地图,因此您可以使用该is_map 功能.

 iex(1)> foo = 1..3
 1..3
 iex(2)> is_map(foo)
 true
Run Code Online (Sandbox Code Playgroud)

范围是一个看起来像的地图 %{ __struct__: Range, first: 1, last: 3}

但是,有一种更好的方法可以通过在函数args而不是guards中使用模式匹配来实现所需的功能.

def fun(%Range{} = range) do
  Map.from_struct(range)
end
Run Code Online (Sandbox Code Playgroud)

这将仅匹配Range Struct,而不匹配任何地图.