2016-04-05 1 views
2

So erstelle ich einen IRC-Server, und ich habe eine Funktion, die einen Benutzer aus einer Karte entfernt. Die Idee ist, Mustervergleiche zu verwenden, so dass eine Version einer Funktion aufgerufen wird, wenn der Benutzer in der Karte ist und eine andere Funktion sonst aufgerufen wird.Wie kann ich Muster in einer Funktion zuordnen, in der eine Map einen Schlüssel mit dem übergebenen Wert hat?

Meine erste Idee war folgendes zu tun:

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

Dies ist jedoch nicht variable 'User' is unbound mit dem Fehler kompilieren.

Gibt es eine Möglichkeit, dies mit der Übereinstimmung von Funktionsebenenmustern zu erreichen?

Antwort

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. 

Ich glaube, Sie nicht Einstimmungsmuster in Funktionsebene verwenden können, aber Sie is_key(Key, Map) -> boolean() können User ist in UserMap zu überprüfen. Hier ist der Link: http://erlang.org/doc/man/maps.html#is_key-2

3

Sie können Muster tun passend zur Karte Schlüssel in einem Funktionskopf, aber Sie tun können, in 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.