2016-12-15 3 views
1

"パターンマッチング"できればどうすればいいですか?私はアクションが同じであるためにいくつかの異なる条件があるので、これが必要ですか?"または"パターンマッチングのエリクシールの条件

case something123 do 
    :a -> func1() 
    :b -> func1() 
    :c -> func1() 
    :d -> func2() 
end 
+0

実際のコードがより複雑な場合は、多分異なる機能のヘッドを使用して、そのように処理してください。 –

答えて

9

あなたはinやリストを使用することができます。inマクロはあなたがすることができないので(それはガード文からコールされていますし、RHSはリテラルのリストであることを検出したときに

case something123 do 
    x when x in [:a, :b, :c] -> func1() 
    :d -> func2() 
end 

x in [:a, :b, :c]x == :a or x == :b or x == :cに展開しますガードから遠隔機能を呼び出す)。

+0

"で"私の実際のコードはより複雑なため、私のために動作しません。代替案は何ですか? – Kooooro

+0

実際のコードでは、どの部分がより複雑になっていますか?より多くの情報がなければ、 'case'は実際には' any'パターンをサポートしていないので、 'case'の代わりに' if'を使わなければならないと言っています。 – Dogbert

+0

条件はすべて異なる部分を持っています – Kooooro

3

複数の機能ヘッドを使用して複数の機能を使用できます。

def foo(%{"key" => "value"}), do: do_something() 
def foo(%{"other_key" => "other_value"}), do: do_something() 
def foo(map), do: do_something_else(map) 

defp do_something() do 
    ... 
end 

defp do_something_else(map) do 
    ... 
end 

これにより、必要なデータを照合し、それに応じて行動することができます。

3

また、condを使用することもできます。

cond do 
    something123 == :a or something123 == :b something123 == :c -> 
    func1() 
    something123 == :d -> 
    func2() 
end 
+0

私は最初に値を解体する必要があります。 – Kooooro

+1

@Kooooro私はあなたのポイントを取得しません。とにかく、変数名を反映するように更新しました。 – vfsoraki

関連する問題