2016-04-05 11 views
2

私はIRCサーバーを作成しており、マップからユーザーを削除する機能があります。この考え方はパターンマッチングを使用することで、ユーザーがマップ内にあれば関数の1つのバージョンが呼び出され、それ以外の場合は別の関数が呼び出されます。Mapに渡された値を持つキーがある関数で、どのようにパターンを一致させることができますか?

私の最初のアイデアは、次の操作を実行することでした。

remove_user_from_channel(User, Channel=#channel_details{users = UserMap=#{User := _}}) -> 
    Channel#channel_details{users = maps:remove(User, UserMap)}. 

しかし、これはエラーvariable 'User' is unboundでコンパイルに失敗します。

機能レベルのパターンマッチングでこれを達成する方法はありますか?

答えて

2
remove_user_from_channel(User, Channel=#channel_details{users = UserMap}) -> 
    case maps:is_key(User, UserMap) of 
     true -> Channel#channel_details{users = maps:remove(User, UserMap)}; 
     false -> ok 
    end. 

私はあなたが関数レベルでの一致パターンを使用することはできませんと思うが、UserMapであるあなたは、Userをチェックするis_key(Key, Map) -> boolean()を使用することができます。 http://erlang.org/doc/man/maps.html#is_key-2

3

あなたは、関数の頭の中でマップキーのパターンマッチングを行うことはできませんが、あなたがcaseで行うことができます:ここで はリンクになって

remove_user_from_channel(User, Map) -> 
    case Map of 
    Channel = #channel_details{users = UserMap = #{User := _}} -> 
     Channel#channel_details{users = maps:remove(User, UserMap)}; 
    _ -> 
     other 
    end. 
関連する問題