我想用一名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,而不匹配任何地图.