2015-10-18 5 views
9

私はis_range()ガードを使用したいと思います。例:エリクシールis_rangeガードは定義されていませんか?私は何を使うべきですか?

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

ただし、is_rangeは存在しません。私は

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

を試みたが、これはどちらか動作しませんでしたエリクサー1.0.5に

を使用しています。

どうすればよいですか?

答えて

13

ガードで使用できる機能の種類は非常に限られています。あなたはis_map 機能を使用できるように

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

範囲は、マップされている構造体です。

iex(1)> foo = 1..3 
1..3 
iex(2)> is_map(foo) 
true 

Aレンジは%{ __struct__: Range, first: 1, last: 3}

しかし、関数引数ではなく、警備員にパターン マッチングを使用することによって、あなたが望むものを達成するためのより良い方法があるように見えるのマップです。

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

これは、マップではなくRange Structにのみ一致します。

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

の要素のメンバーシップを確認するために働きます。

関連する問題