카테고리 없음

[녹] 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