[Rust] 모듈 사용 팁

경로 임의 지정
러스트의 모듈 포함 키워드인 mod는 경로가 기본적으로 고정되어있어 조금 불편한 점이 있다.

**mod asdf;**라고 쓴다면 ./asdf.rs./asdf/mod.rs만을 가져오는 구조기 때문이다.

다행히도 이건 회피법이 있다. path라는 특수한 매크로를 이용하는 것이다. image

image #[path="..."]의 형태로 mod 위에 경로를 명시해주면 모듈명도 내맘대로, 경로도 내맘대로 할 수 있다.


image

image 뚜둔



중복포함 문제
러스트의 모듈시스템은 C++보단 우월하지만 그래도 조금 불편한게 있긴 하다.

포함관계가 막 이어지고 복잡할 때는 무조건 mod만 쓰면 안된다.
만약 A를 B에서 포함시키고, C에서 또 포함시킨다음 B와 C를 메인 로직에 포함시키면 어떨까?

예시는 다음과 같다. image

image 구조체 A를 b와 c에서 동시에 포함시키고

main에서 포함시켜서, b의 A에 c의 A를 매칭시켜봤다. image

image

그럼 어떨까?
논리적으로는 동일한 타입이어야 하지만 실제 동작은 다르다. image

image 같은 소스였더라도 다른 곳에서 포함했다면 그것은 완전히 다른 타입이 되는 것이다.

그럼 이걸 어떻게 해야할까.

가장 바람직한 방법은 한번만 포함시키고, 그 이후로는 use만 사용해서 가져오는 것이다.

우선, 모듈들을 모아둘 파일을 하나 만들어둔다. 지금의 경우에는 main.rs로 하겠지만, 실 사용 시에는 lib.rs로 하는게 좋을 것이다. image

image 이렇게

그리고 b와 c에서는 직접 mod하지 않고 main에서 당겨온 모듈을 간접적으로 사용한다. image

image super는 현재 모듈에서 한칸 위로 올라간다는 키워드다. 두칸 위에 있으면 super::super::... 처럼 하면 된다.

그럼 이제 오류가 뜨지 않을 것이다. image

image

근데 super로 위치를 명시하는건 꽤 불편한 편이다. 모듈 구조가 깊어질수록 좀... 지저분해지기도 하고 말이다.
그래서 lib.rs나 main.rs 등의 기본 레벨 소스에서 mod를 한 경우에는 루트 모듈을 가리키는 crate 키워드를 쓰는 것이 편하다. image

image 동일하게 동작할 것이다.