카테고리 없음
[녹] Rust에서 두 문자열 중 하나를 참조하지 않고 연결할 수없는 이유는 무엇입니까?
필살기쓰세요
2021. 1. 28. 17:58
대답은 두 부분으로 나뉩니다.
첫 번째 부분은 특성 구현을
+
사용
하는 Add
것
입니다. 다음 용도로만 구현됩니다.
impl<'a> Add<&'a str> for String
따라서 문자열 연결은 다음 경우에만 작동합니다.
- 왼쪽은
String
- 오른쪽은 강제로
&str
참고 : 다른 많은 언어와 달리 더하기는 Left Hand Side 인수를 사용합니다.
따라서 두 번째 부분은 a
&str
가 예상 될 때 어떤 종류의 인수를 사용할 수 있습니까?분명히 a
&str
는 그대로 사용할 수 있습니다.
let hello = "Hello ".to_string();
let hello_world = hello + "world!";
그렇지 않으면, 유형에 대한 참조 구현
Deref<&str>
의지 작업을하고 밖으로 그집니다
String
그렇게
&String
작동합니다 :
let hello = "Hello ".to_string();
let world = "world!".to_string();
let hello_world = hello + &world;
그리고 다른 구현은 무엇입니까? 그들은 모두 문제가 있습니다.
impl<'a> Add<String> for &'a str
추가하는 것만 큼 효율적이지 않습니다.impl Add<String> for String
하나가 충분할 때 불필요하게 두 가지 주장을 소비impl<'a, 'b> Add<&'a str> for &'b str
무조건적인 메모리 할당을 숨 깁니다.
결국, 비대칭 적 선택은 가능한 한 명시 적이라는 Rust 철학에 의해 설명됩니다.또는 좀 더 명확하게하기 위해 연산의 알고리즘 복잡성을 확인하여 선택을 설명 할 수 있습니다. 왼쪽의 크기가 M이고 오른쪽의 크기가 N이라고 가정하면 다음과 같습니다.
impl<'a> Add<&'a str> for String
O (N) (상각)impl<'a> Add<String> for &'a str
O (M + N)impl<'a, 'b> Add<&'a str> for &'b str
O (M + N)impl Add<String> for String
O (N) (상각) ...하지만 오른쪽을 할당 / 복제해야합니다.
-------------------
표준 라이브러리
구현 다음 :
impl<'a> Add<&'a str> for String
정확하게 당신이 눈치 챘을 것입니다 어느, 당신은 단지를 추가 할 수 있습니다
&str
A를
String
.여기에는 다음과 같은 장점이 있습니다.
&str
슬라이스 사용- 사용
&String
(& str에 대한 역 참조로) - (추가 된) 이전 문자열 유지
출처
https://stackoverflow.com/questions/39917395