Rust collection

String 처리 지도

러스트 문자열은 바이트 저장소, 유니코드 문자, 사람이 보는 글자 단위가 서로 다르다는 점을 드러내도록 설계되어 있다.

bytes

저장 단위

실제 메모리는 UTF-8 바이트 배열이다. 한 글자가 여러 바이트를 차지할 수 있다.

chars

스칼라 값

chars()는 유니코드 스칼라 값을 차례대로 준다. 보이는 글자와 항상 같지는 않다.

grapheme

사용자 글자

사람이 한 글자로 보는 묶음은 별도 처리가 필요하다. 조합 문자를 고려해야 한다.

slice

경계 검사

문자열 슬라이스는 유효한 UTF-8 경계에서만 잘라야 런타임 패닉을 피한다.

작업
도구
소유권과 가독성
문자열 붙이기
push_str(&str)
빌린 문자열 조각을 뒤에 붙인다. 오른쪽 값의 소유권은 가져가지 않는다.
문자 하나 추가
push(char)
단일 스칼라 값을 추가할 때 의도가 가장 직접적으로 드러난다.
두 문자열 결합
left + &right
왼쪽 String은 이동되고 오른쪽은 슬라이스로 빌려진다.
여러 값 조합
format!
인수를 모두 빌리므로 소유권 흐름이 덜 복잡하고 문장이 읽기 쉽다.
부분 읽기
bytes() 또는 chars()
숫자 인덱스 대신 원하는 의미 단위를 명시해서 순회한다.

빠른 접근보다 의미가 먼저

문자열의 n번째 바이트와 n번째 글자는 같은 질문이 아니다. 러스트는 모호한 접근을 허용하지 않는다.

슬라이스는 경계가 핵심

잘린 범위가 UTF-8 문자 중간을 가르면 문자열로 해석할 수 없으므로 경계 검사가 필요하다.

반복자는 의도를 남긴다

바이트 분석인지 문자 처리인지 코드에 드러나면 비용과 결과를 같이 예측할 수 있다.