Elixir는 코드 _Behaviour_를 사용해, 공통된 범용 인터페이스를 제공하면서도 각 모듈이 그 인터페이스를 구체적으로 구현할 수 있게 해줘요. 그중 대표적인 예가 바로 _Access Behaviour_예요.
_Access Behaviour_는 키 기반 데이터 구조에서 값을 가져오기 위한 공통 인터페이스를 제공해요. _Access Behaviour_는 맵과 키워드 리스트에 대해 구현되어 있는데, 감을 잡을 수 있도록 맵에서의 사용법을 살펴봐요. _Access Behaviour_는 맵이 있으면 그 뒤에 _대괄호_를 붙이고, 키를 사용해 그 키에 연결된 값을 가져올 수 있다고 정의해요.
# Suppose we have these two maps defined (note the difference in the key type)
my_map = %{key: "my value"}
your_map = %{"key" => "your value"}
# Obtain the value using the Access Behaviour
my_map[:key] == "my value"
your_map[:key] == nil
your_map["key"] == "your value"
데이터 구조에 키가 없으면 nil이 반환돼요. 이 때문에 의도하지 않은 동작이 생길 수 있는데, 오류를 발생시키지 않기 때문이에요. 참고로 nil 자체도 Access Behaviour를 구현하고 있어서, 어떤 키에 대해서도 항상 nil을 반환해요.
지역 농구팀의 웹사이트를 유지 관리하기 위해 웹 개발팀과 함께 일하고 있어요. 웹 개발팀은 Elixir에 익숙하지 않아서, 빠른 개발을 위해 중첩된 맵에서 데이터를 추출할 수 있는 함수를 부탁했어요.
extract_from_path/2 함수를 구현해요. 이 함수는 두 개의 인자를 받아요:
data: 농구팀에 대한 데이터가 담긴 중첩된 맵 구조예요.path: 마지막 키에 연결된 값을 얻기 위해 마침표로 구분된 키로 이루어진 문자열이에요.경로 상의 어느 지점에서든 값이나 키가 존재하지 않으면 nil을 반환해야 해요
data = %{
"team_mascot" => %{
"animal" => "bear",
"actor" => %{
"first_name" => "Noel"
}
}
}
BasketballWebsite.extract_from_path(data, "team_mascot.animal")
# => "bear"
BasketballWebsite.extract_from_path(data, "team_mascot.colors")
# => nil
이 함수를 구현할 때는 _Access Behaviour_를 사용해요.
중첩된 맵 데이터 구조를 다룰 때는 Map이나 Kernel 모듈의 함수를 사용하지 마세요.
코드를 리뷰하던 동료가 여러분의 구현과 아주 비슷한 일을 하는 Kernel 모듈 함수를 알려줘요.
get_in_path/2를 이 Kernel 모듈 함수를 사용하도록 구현해요.
기대하는 인자는 1번과 같아요.
BasketballWebsite.get_in_path(data, "team_mascot.actor.first_name")
# => "Noel"
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.