Understanding the caveat of using Access Module in Elixir

posted by donghyun

2 min read

태그

Today, I want to share a crucial insight into a common pitfall when using the Access module in Elixir. This concept is critical, especially when dealing with data that could be either a struct or a map.

In Elixir, we often use the Access.get/2 function to retrieve the value of a specific key from a map or a struct. However, it’s important to note that there’s a subtle difference in how we should use Access.get for maps and structs.

Structs vs. Maps: The Important Distinction

When dealing with a struct, we should use Access.key/1 for retrieving a field. Here’s an example:

data = %User{id: 1}
id = Access.get(data, Access.key(:id))

The code above works as expected - it fetches the id field from the User struct.

Now, the pitfall emerges when we deal with maps. You should not use Access.key/1 for map data. If you do, the result will be nil instead of an error, which could be misleading and may lead to potential bugs.

The Silent Bug: No Error, Just nil

Imagine you have a map and you try to use Access.key/1 to get a value. The function will not throw an error; instead, it will silently return nil. This scenario might be troublesome because your program will continue running, and you might not even be aware that you’ve encountered a bug until it manifests itself in a different, possibly more critical, part of your system.

To prevent this from happening, always remember: Access.key/1 does not work with Elixir maps.

In conclusion, while the Access module is a powerful tool in Elixir, it’s crucial to be aware of its caveats to avoid potential pitfalls. Always use the appropriate function for the data structure you’re dealing with to ensure accurate results and maintain the robustness of your code.