같은 프로젝트 안에서 서로 다른 Elixir 모듈끼리 코드를 공유하려면, 바깥 모듈을 전체 이름으로 참조해야 해요. 그런데 그 이름이 너무 길거나 헷갈린다면 어떨까요?
특수 형식 alias을 사용하면 바깥 모듈을 참조할 때 쓰는 이름을 줄이거나 바꿀 수 있어요. 인자 없이 사용하면 모듈 이름을 마지막 부분만 남기고 줄여요. 예를 들어 MyApp.Logger.Settings는 Settings가 돼요. 원하는 이름은 :as 옵션으로 지정할 수 있어요.
보통 alias는 모듈 정의의 맨 앞에 추가해요.
defmodule Square do
alias Integer, as: I
def area(a), do: I.pow(a, 2)
end
특수 형식 import을 사용하면 모듈 이름을 쓰지 않고도 바깥 모듈의 함수를 사용할 수 있어요.
바깥 모듈 전체를 가져오면 기존 로컬 함수와 충돌이 생길 수 있어요. 이를 피하려면 :except와 :only 두 가지 옵션을 쓸 수 있어요. 둘 다 키워드 리스트를 받는데, 키는 함수 이름이고 값은 함수의 인자 수예요.
보통 import도 모듈 정의의 맨 앞에 추가해요.
defmodule Square do
import Integer, only: [pow: 2]
def area(a), do: pow(a, 2)
end
최근에 산 무선 조종 자동차가 완전히 새로운 취미가 되었어요. 무선 조종 자동차 경주를 열고 있었죠.
경주 시뮬레이션을 돌릴 수 있는 프로그램을 거의 다 작성했을 때, 고양이가 키보드 위로 뛰어올라 코드 몇 줄을 지워 버렸어요. 이제 프로그램이 더 이상 컴파일되지 않아요...
Race.__struct__/0 is undefined 해결하기모듈 NeedForSpeed.Race를 더 짧은 이름 Race로 참조할 수 있도록 별칭을 추가해요.
Car.__struct__/0 is undefined 해결하기모듈 NeedForSpeed.RemoteControlCar를 더 짧은 이름 Car로 참조할 수 있도록 별칭을 추가해요.
undefined function puts/1 해결하기puts/1 함수는 IO 모듈에 있어요. 모듈을 참조하지 않고도 사용할 수 있도록 임포트해요.
undefined function default_color/0 해결하기함수 default_color/0, red/0, cyan/0, green/0은 모두 IO.ANSI 모듈에 있어요. 다른 자동차 색상도 지원할 계획이라서 모듈 전체를 임포트하려고 해요. 그런데 안타깝게도 IO.ANSI 모듈의 color/1 함수가 직접 정의한 로컬 함수 하나와 충돌해요. 그 함수 하나만 제외하고 IO.ANSI 모듈 전체를 임포트해요.
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.