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

时间:2015-10-18 00:41:59

标签: elixir

我想使用is_range()后卫。例如:

def foo(bar) when is_range(bar) do
    # stuff
end

is_range不存在?我使用的是Elixir 1.0.5

我试过

def foo(bar) when Range.range?(bar) do
    # stuff
end

但这也没有效果。

我该怎么办?

2 个答案:

答案 0 :(得分: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

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

的地图

但是,有一种更好的方法可以通过使用模式来实现您想要的效果 匹配函数args而不是守卫。

def fun(%Range{} = range) do
  Map.from_struct(range)
end

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

答案 1 :(得分:0)

要测试某个值是否属于某个范围的成员,您可以使用in

def is_high?(number) when number in 50..100 do true end

这也适用于检查列表中元素的成员资格 def is_a_great_number?(number) when number in [5,7,11] do true end

我意识到这不是你的问题,但这是我在找到这个问题时所寻找的答案。