programing

러스트의 스트링과 스트링의 차이점은 무엇일까.

goodsources 2023. 4. 21. 20:49
반응형

러스트의 스트링과 스트링의 차이점은 무엇일까.

에는 왜 'Rust'가 있는 죠?String ★★★★★★★★★★★★★★★★★」str의 차이는 무엇입니까?String ★★★★★★★★★★★★★★★★★」strStringstr리고고 그???그 중 한 명이 더 이상 사용되지 않는 건가요?

String 스트링 입니다.예를 들면, 「입니다.Vec: 또는 할 때 문자열 데이터를 소유하거나 변경해야 할 때 사용합니다.

str는, 메모리내의 다이나믹 길이의 UTF-8 바이트의 불변의1 시퀀스입니다.크기를 알 수 없기 때문에 포인터 뒤에서만 처리할 수 있습니다.즉,str가장 일반적으로2 나타나다&str: UTF-8 데이터에 대한 참조.일반적으로 '스트링 슬라이스' 또는 '슬라이스'라고 불립니다.슬라이스는 일부 데이터에 대한 보기일 뿐이며, 데이터는 예를 들어 어디에나 있을 수 있습니다.

  • 정적 스토리지: 문자열 리터럴"foo"는 입니다.&'static str데이터는 실행 파일에 하드 코드되어 프로그램 실행 시 메모리에 로드됩니다.

  • 할당된 힙 내부: 뷰에 대한 참조String을 사용하다

  • 스택: 예를 들어 다음과 같이 스택에 할당된 바이트 배열을 만들고 해당 데이터를 로 표시합니다.

    use std::str;
    
    let x: &[u8] = &[b'a', b'b', b'c'];
    let stack_str: &str = str::from_utf8(x).unwrap();
    

「」를 합니다.String하고 있는 데이터스레드에 등가, "String data"를 사용합니다.&str문자열 보기만 필요한 경우.

은 벡터의 .Vec<T> 슬라이스 " " " " "&[T]값별 관계와 유사합니다.T 참조용 ★★★★★&T츠미야


1 A.str고정 길이종료를 초과하여 바이트를 쓰거나 말미에 비활성 바이트를 남길 수 없습니다.이므로 사실상 UTF-8이 됩니다.str많은 경우 불변합니다. 많은 더 적은 를 쓸 가 있습니다, 된 바이트).a 바이트 (1 바이트) )ä는 (2+바이트)에 을 더 해야 합니다.str)를할 수 있는 &mut str(대부분 ASCII 문자만을 처리하는 것 등)이 준비되어 있습니다.

다이내믹 사이즈의 타입에 의해, 2다음과 같은 것이 가능하게 됩니다.Rc<str>Lust 1.2 이후 UTF-8 바이트 카운트된 일련의 참조에 대해 설명합니다.녹 1.21을 사용하면 이러한 유형을 쉽게 만들 수 있습니다.

는 C을 가지고 , C++의 경우, C++의 경우, C++의 경우라고 .String ★★★★★★★★★★★★★★★★★」&strC++:

  • Rust »Stringa a 같다std::string; 메모리를 소유하고 메모리 관리라는 더러운 일을 합니다.
  • Rust »&stra a 같다char*( 조금 더 : (어느 쪽인가 하면) : (어느 쪽인가 하면) : ( 쪽인가 하면)의에 대한 포인터를 수 있는 , 이것은, 다음의 내용에 대한 포인터를 얻을 수 있는 것과 같은 방법으로,std::string.

둘 중 하나가 사라지는 건가요?난 그렇게 생각하지 않아.두 가지 목적이 있습니다.

String이치노 &str는 가볍기 때문에 스트링을 "찾아보기" 위해 사용해야 합니다.새 메모리를 할당할 필요 없이 청크를 검색, 분할, 구문 분석 및 교체할 수 있습니다.

&str을 수 String문자열 리터럴을 가리킬 수 있습니다. .String「이것들」은 다음과 같습니다.

let a: String = "hello rust".into();

다음 코드를 사용하면 복사 없이 리터럴 자체를 사용할 수 있습니다(단, 읽기 전용).

let a: &str = "hello rust";

렇렇 it it it it 。strString한 조각이 아니라

str로, 으로는 사전문자열 텍스트입니다.

"Hello World"

이 텍스트는 어딘가에 저장되어야 하므로 프로그램의 기계 코드와 함께 실행 파일의 데이터 섹션에 바이트 순서([u8])로 저장됩니다.텍스트는 임의의 길이로 사용할 수 있으므로 크기가 동적으로 조정됩니다.

┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│  H  │  e  │  l  │  l  │  o  │     │  W  │  o  │  r  │  l  │  d  │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│  72 │ 101 │ 108 │ 108 │ 111 │  32 │  87 │ 111 │ 114 │ 108 │ 100 │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

저장된 텍스트에 액세스할 수 있는 방법이 필요합니다. 여기서 슬라이스가 삽입됩니다.

조각,[T]는 메모리 블록의 뷰입니다.변동 가능 여부에 관계없이 슬라이스는 항상 빌리기 때문에 항상 포인터 뒤에 있습니다.&.

동적 크기의 의미에 대해 설명하겠습니다. 일부 언어에서는됩니다(C는 0바이트입니다).\0스트링의 마지막에, 개시 주소의 레코드를 보관합니다.문자열의 길이를 결정하려면 프로그램은 시작 위치에서 이 0바이트를 찾을 때까지 원시 바이트를 통과해야 합니다.따라서 텍스트의 길이는 임의의 크기로 지정할 수 있으므로 동적으로 크기가 지정됩니다.

녹슬다슬라이스를 사용합니다.는 라이스 a a a a a a a a a a a a a a a의 주소를 합니다.str을 사용하다계산은 컴파일 중에 미리 이루어지므로 0바이트를 추가하는 것보다 낫다.텍스트는 임의의 크기를 가질 수 있기 때문에 유형 시스템의 관점에서 볼 때 여전히 동적으로 크기가 조정됩니다.

따라서 "Hello World" 식에서는 실제 데이터의 주소와 길이가 모두 포함된 팻 포인터가 반환됩니다.이 포인터는 실제 데이터에 대한 우리의 핸들이 될 것이며 우리의 프로그램에도 저장될 것입니다.이제 데이터는 포인터 뒤에 있으며 컴파일러는 컴파일 시 그 크기를 알 수 있습니다.

코드에 중인 타임 중인 프로그램의 라이프 타임 전체에 유효합니다.static라이프 타임

따라서 "Hello Word" 식의 반환값은 다음 두 가지 특성을 반영해야 합니다.

let s: &'static str = "Hello World";

이가 '보다'로 수 .str 그런 것은 [u8]이는 데이터가 항상 유효한 UTF-8 시퀀스임을 보증하기 때문입니다.UTF-8은 UTF-8을 사용합니다.4번으로 하다【u8】

개의 Rust가 됩니다.str는 데이터 섹션에 서로 인접하여 저장되며, 한쪽은 어디서 시작하고 다른 한쪽은 종료되는지 알 수 없습니다.

컴파일러는 더 나아가고 있습니다.프로그램의 여러 위치에서 동일한 정적 텍스트가 사용되는 경우, Rust 컴파일러는 프로그램을 최적화하고 실행 파일의 데이터 섹션과 코드 내의 각 슬라이스가 이 이진 블록을 가리킵니다.

를 들어 "World"라는내용을 단일 은 "Hello World"라는 도 마찬가지입니다.【3 】"Hello World":

let x: &'static str = "Hello World";
let y: &'static str = "Hello World";
let z: &'static str = "Hello World";

String한편, u8의 벡터로서 값을 저장하는 특수한 타입입니다.,.String코드에 되어 있습니다.type 소소 、 type 、 type type type type type 。

pub struct String {
    vec: Vec<u8>,
}

벡터가 된다는 것은 다른 벡터 값과 마찬가지로 힙 할당 및 크기 조정이 가능하다는 것을 의미합니다.

전문화란 임의의 액세스를 허용하지 않고 데이터가 항상 유효한 UTF-8임을 확인하는 것을 의미합니다.그 외에는 벡터일 뿐입니다.

a 비기상 so so so String는 UTF-8 텍스트를 유지하는 크기 조정 가능한 버퍼입니다.이 버퍼는 힙에 할당되므로 필요에 따라 또는 요청에 따라 확장할 수 있습니다.이 버퍼는 어떻게든 채울 수 있어요.을 사용하다

★★★★★★★★★★★★★★★★★.vec필드는 유효성을 적용하기 위해 비공개로 유지됩니다.이것은 비공개이므로 String 인스턴스를 직접 생성할 수 없습니다.모든 바이트 스트림이 유효한 utf-8 문자를 생성하는 것은 아니며 기본 바이트와의 직접 대화에 의해 문자열이 파손될 수 있기 때문에 이 스트링이 비공개로 유지됩니다.을 .u8메서드 및 메서드를 통한 바이트는 특정 체크를 수행합니다.우리는 사적인 것과 방법을 통한 통제된 상호작용이 확실한 보증을 제공한다고 말할 수 있다.

String 인스턴스 작성에는 String type에 정의된 몇 가지 방법이 있습니다.new는 그 중 하나입니다.

pub const fn new() -> String {
  String { vec: Vec::new() }
}

유효한 String을 작성하기 위해 사용할 수 있습니다.

let s = String::new();
println("{}", s);

아쉽게도 입력 파라미터는 사용할 수 없습니다.따라서 결과는 유효하지만 빈 문자열이지만 할당된 값을 유지하기에 용량이 충분하지 않은 경우 다른 벡터처럼 증가합니다.그러나 성장하려면 재할당이 필요하기 때문에 애플리케이션 성능이 저하될 수 있습니다.

다른 소스로부터의 초기값으로 기본 벡터를 채울 수 있습니다.

문자열 리터럴에서

let a = "Hello World";
let s = String::from(a);

str, 그 은 ""를 통해 에 할당된 벡터에 됩니다.String.from실행 가능한 바이너리를 체크하면 "Hello World"라는 내용의 원시 바이트가 데이터 섹션에 표시됩니다.이것은 일부 사람들이 놓치는 매우 중요한 세부 사항입니다.

가공되지 않은 부품부터

let ptr = s.as_mut_ptr();
let len = s.len();
let capacity = s.capacity();

let s = String::from_raw_parts(ptr, len, capacity);

캐릭터에서

let ch = 'c';
let s = ch.to_string();

바이트의 벡터로부터

let hello_world = vec![72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100];
// We know it is valid sequence, so we can use unwrap
let hello_world = String::from_utf8(hello_world).unwrap();
println!("{}", hello_world); // Hello World

여기 또 다른 중요한 세부사항이 있습니다.는 임의의 수 , 그할 수 는 UTF-8을으로써 이를 고려해야 .따라서 Rust는 다음 값을 반환함으로써 이 점을 고려해야 합니다.Result<String, FromUtf8Error>가 a a String.

입력 버퍼에서

use std::io::{self, Read};

fn main() -> io::Result<()> {
    let mut buffer = String::new();
    let stdin = io::stdin();
    let mut handle = stdin.lock();

    handle.read_to_string(&mut buffer)?;
    Ok(())
}

또는 다른 유형의 구현에서ToString 분석

★★String후드 아래의 벡터이며 다음과 같은 벡터 특성을 나타냅니다.

  • 포인터:포인터는 데이터를 저장하는 내부 버퍼를 가리킵니다.
  • length : 길이는 버퍼에 현재 저장되어 있는 바이트 수입니다.
  • 용량:capacity는 버퍼 크기(바이트)입니다.따라서 길이는 항상 용량보다 작거나 같아야 합니다.

또한 몇 가지 특성과 방법을 벡터에 위임합니다.

pub fn capacity(&self) -> usize {
  self.vec.capacity()
}

에서는 「」를 사용하고 있습니다.String::from그래서 사람들은 왜 다른 문자열에서 String을 만드는지 헷갈린다.

오래 읽었으니까 도움이 됐으면 좋겠네요.

들르아, 아.str는 타입 레벨에 지나지 않습니다.이것은 이른바 Dynamic-Size Type(DST; 다이내믹사이즈 타입)이기 때문에 타입 레벨에서만 추론할 수 있습니다.「」의 str컴파일 시에는 알 수 없고 런타임 정보에 의존합니다.컴파일러가 각 변수의 크기를 알아야 하기 때문에 변수에 저장할 수 없습니다. a.str는 개념적으로 ''의 에 불과합니다.u8유효한 UTF-8을 형성하는 것을 보증하는 바이트입니다.의의크 기마 ?? ????런타임까지 아무도 모르기 때문에 변수에 저장할 수 없습니다.

은...&str로서 또른른 에 대한 strBox<str> 런타임에 존재합니다.이것은 이른바 "팻 포인터"로, 추가 정보(이 경우 가리키는 물건의 크기)가 있는 포인터이므로 크기가 두 배입니다.사실...&strString, (그냥)에게는.&StringA ) 。&str단어로, 2개의 의 첫 입니다.str로, 른른, 치 and, 치 and, - and, -메, -메, -메, -메, - and, - and, - and, - and, - and, - and, - and and, -, -, and, and and, and, and, and, and, and, long, long, str empty.month.mpti.

말과는 달리str불변할 필요는 없습니다.만약 구할 수 있다면&mut str에 대한 str을 사용하다변환되는 모든 안전한 함수는 UTF-8 제약이 유지됨을 보증합니다.이는 UTF-8 제약이 위반될 경우 라이브러리가 이 제약이 참이라고 가정하고 이를 확인하지 않기 때문입니다.

'A'가 죠?String3단어, 2단어, 2단어랑 똑같아요.&str세 번째 단어를 추가하는데, 그것은 그 능력이다.str(「」, 「」, 「」(a)str반드시 힙에 있는 것은 아님)이 가득 차기 전에 관리하며 다시 작성해야 합니다.String기본적으로 소유하다str제어하고 크기를 조정하여 적합하다고 판단될 때 재할당할 수 있습니다. ★★★★★★★★★★★★★★★★★★.String라고 하는 것은, 「」에 입니다.&str 훨씬str.

는 ★★★★★★★★★★★★★★★★★★★.Box<str>이합니다. ; 것도소소소소 ; 。str 시 은 실행 시 표현과 .&str, 「CHANGE」도 소유하고 있습니다.str는 the와는 &str할 수 으로는 크기를 조정할 수 없습니다.Box<str>한 길이로 볼 수String할 수 합니다).String크기를 변경할 경우).

사이에는 매우 유사한 관계가 존재한다.[T] ★★★★★★★★★★★★★★★★★」Vec<T>, 이지 않은 할 수 있습니다.

「 」의 str, 즉 일반 추상화를 것입니다.&str; 쉽게 특성을 쓸 수 있도록 타입 레벨에 존재합니다.str, 존재하기만 하면 되는 &str하지만 이제는 범용적인 코드를 많이 작성해야 합니다.

&str는, 복수의 할 수 합니다.String, 바와 , A.String 소유주str 힙 에서 ""의 할 수 StringStringRust에 있는 모든 것은 메모리 안전을 다룰 단 한 명의 소유자를 가질 수 있기 때문에 복사해야 합니다.예를 들어 문자열을 슬라이스할 수 있습니다.

let string: String   = "a string".to_string();
let substring1: &str = &string[1..3];
let substring2: &str = &string[2..4];

서브스트링이 .str은은문문 문다다다다다 string는, 의 풀 「풀」(full)을 소유하는 입니다.str와 """의 버퍼""&str서브스트링은 힙상의 버퍼에 대한 fat 포인터일 뿐입니다.

str, 로만 사용됩니다.&str는 UTF-8 바이트어레이를 참조하는 문자열 슬라이스입니다.

String 옛날에는 그랬다~strUTF-8의 UTF-8입니다.

»&str ★★★★★★★★★★★★★★★★★」String


String:

  • Rust가 소유한 String 타입은 문자열 자체가 힙에 존재하기 때문에 변경 가능하며 크기와 내용을 변경할 수 있습니다.
  • 문자열을 소유한 변수가 범위를 벗어나면 문자열이 소유되므로 힙의 메모리가 해방됩니다.
  • 변수 " " "Stringpointers + 관련 메타데이터)는 fat pointers(fat pointers + fat pointers)입니다.
  • 지방 3 × 8 、 、 음 3 、 음 3 、 음 3 、 음 3 、 음 3 개 、 fat 3 개 、 fat fat 、
    • 힙의 실제 데이터에 대한 포인터로 첫 번째 문자를 가리킵니다.
    • 문자열 길이(문자 수)
    • 힙의 문자열 용량

&str:

  • Rust의 비소유 String 유형으로 기본적으로 불변입니다.스트링 자체는 보통 힙 위 또는 메모리 내의 다른 장소에 존재합니다.'static★★★★★★ 。
  • String이 경우 은 비소유이기 입니다.&str변수가 범위를 벗어나면 문자열의 메모리가 해방되지 않습니다.
  • 변수 " " "&strpointers + 관련 메타데이터)는 fat pointers(fat pointers + fat pointers)입니다.
  • 지방 2 × 8 ( wordsize ), 2 ( wordsize ), 2 ( wordsize ), 2 ( wordsize )
    • 힙의 실제 데이터에 대한 포인터로 첫 번째 문자를 가리킵니다.
    • 문자열 길이(문자 수)

예:

use std::mem;

fn main() {
    // on 64 bit architecture:
    println!("{}", mem::size_of::<&str>()); // 16
    println!("{}", mem::size_of::<String>()); // 24

    let string1: &'static str = "abc";
    // string will point to 'static memory which lives throughout the whole program

    let ptr = string1.as_ptr();
    let len = string1.len();

    println!("{}, {}", unsafe { *ptr as char }, len); // a, 3
    // len is 3 characters long so 3
    // pointer to the first character points to letter a

    {
        let mut string2: String = "def".to_string();

        let ptr = string2.as_ptr();
        let len = string2.len();
        let capacity = string2.capacity();
        println!("{}, {}, {}", unsafe { *ptr as char }, len, capacity); // d, 3, 3
        // pointer to the first character points to letter d
        // len is 3 characters long so 3
        // string has now 3 bytes of space on the heap

        string2.push_str("ghijk"); // we can mutate String type, capacity and length will also change
        println!("{}, {}", string2, string2.capacity()); // defghijk, 8

    } // memory of string2 on the heap will be freed here because owner goes out of scope

}

std::String a순한 of of of of of of of of of of의 이다.u8. 그 정의는 소스 코드에서 찾을 수 있습니다.힙 할당으로 확장 가능합니다.

#[derive(PartialOrd, Eq, Ord)]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct String {
    vec: Vec<u8>,
}

str는 문자열 슬라이스라고도 불리는 원시 유형입니다.문자열 슬라이스는 크기가 고정되어 있습니다.문자 그대로의 문자열과 같은let test = "hello world" 있다&'static str 유형.test는 이 스태틱하게 할당된 문자열을 참조합니다. &str할 수 . 수정은 할 수 없습니다.

let mut word = "hello world";
word[0] = 's';
word.push('\n');

str가 있습니다.&mut str를 들면, '아까다'와 같이요pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)

let mut s = "Per Martin-Löf".to_string();
{
    let (first, last) = s.split_at_mut(3);
    first.make_ascii_uppercase();
    assert_eq!("PER", first);
    assert_eq!(" Martin-Löf", last);
}
assert_eq!("PER Martin-Löf", s);

그러나 UTF-8에 대한 작은 변경으로 바이트 길이가 변경될 수 있으며 슬라이스는 참조를 재할당할 수 없습니다.

쉽게 말하면String히프에 되어 있습니다(「」와 ).Vec그 할 수 에 액세스 할 수 있습니다.

&str슬라이스 타입입니다., 이미 하고 있는 ,, 미, 미, 미, 미, 미, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that,String산더미 속 어딘가에.

&str는 런타임에 할당을 하지 않습니다.메모리상의 로 '기억의 이유'를 할 수 있습니다.&str에 걸쳐서String단, 사용할 때는 주의해 주십시오.&str노골적인 수명을 감당해야 할 수도 있어요


C# 및 Java 사용자:

  • String===StringBuilder
  • 슬다&str의) 문자열불변의) 문자열

는 ★★★★★★를 생각하고 .&str변경할 수 없는 Java/C#의 내부 문자열과 같이 문자열에 대한 보기로서 새 문자열만 만듭니다.

일부 사용법

예_1.rs

fn main(){
  let hello = String::("hello");
  let any_char = hello[0];//error
}

예_2.rs

fn main(){
  let hello = String::("hello");
  for c in hello.chars() {
    println!("{}",c);
  }
}

예_3.rs

fn main(){
  let hello = String::("String are cool");
  let any_char = &hello[5..6]; // = let any_char: &str = &hello[5..6];
  println!("{:?}",any_char);
}

Shadowing

fn main() {
  let s: &str = "hello"; // &str
  let s: String = s.to_uppercase(); // String
  println!("{}", s) // HELLO
}

function

fn say_hello(to_whom: &str) { //type coercion
     println!("Hey {}!", to_whom) 
 }


fn main(){
  let string_slice: &'static str = "you";
  let string: String = string_slice.into(); // &str => String
  say_hello(string_slice);
  say_hello(&string);// &String
 }

Concat

 // String is at heap, and can be increase or decrease in its size
// The size of &str is fixed.
fn main(){
  let a = "Foo";
  let b = "Bar";
  let c = a + b; //error
  // let c = a.to_string + b;
}

:String ★★★★★★★★★★★★★★★★★」&str 동안 99%만 써야 .&str.

Rust에서 str은 Unicode 스칼라 값의 시퀀스를 나타내는 원시 유형으로 문자열 슬라이스라고도 합니다.즉, 문자열에 대한 읽기 전용 뷰이며 가리키는 메모리를 소유하지 않습니다.한편, String은 확장 가능한, 가변 가능한 소유 문자열 유형입니다.즉, String을 작성할 때 힙에 메모리를 할당하여 문자열의 내용을 저장하고 String이 범위를 벗어나면 이 메모리의 할당을 해제합니다.String은 확장 및 변경이 가능하므로 String 작성 후 내용을 변경할 수 있습니다.

일반적으로 str은 String과 같은 다른 데이터 구조에 저장된 문자열 슬라이스를 참조할 때 사용됩니다.문자열 값은 문자열 값을 만들고 소유할 때 사용합니다.

String을 사용하다

&str는 객체의 일부에 있는 포인터입니다.

여기에 이미지 설명 입력

이 3가지 타입에서는

let noodles = "noodles".to_string();
let oodles = &noodles[1..];
let poodles = "ಠ_ಠ"; // this is string literal
  • String에는 UTF-8 텍스트를 유지하는 크기 조정 가능한 버퍼가 있습니다.버퍼는 힙에 할당되므로 필요에 따라 또는 요청에 따라 버퍼 크기를 조정할 수 있습니다.이 예에서 "noodles"는 8바이트 버퍼를 소유하는 문자열이며, 이 중 7바이트가 사용되고 있습니다.확실히 할 수 할 수 String은 해서 UTF-8을 유지할 수 .을 사용하다String구현되어 있습니다.

  • A &str는 다른 사용자가 소유한 UTF-8 텍스트의 실행을 참조하는 것입니다.이 텍스트는 '차용'됩니다.이 예에서 odles는 "noodles"에 속하는 텍스트의 마지막 6바이트를 가리키는 &str이므로 "woodles"라는 텍스트를 나타냅니다. 로 a는,&str는 입니다.fat pointer는 실제 데이터의 주소와 그 길이를 모두 포함합니다.를 들면 '아예'라고 .&strUTF-8은 UTF-8과 [u8]의 조합입니다.

  • A string literal는 입니다.&str이는 미리 할당된 텍스트를 나타내며, 일반적으로 프로그램의 기계 코드와 함께 읽기 전용 메모리에 저장됩니다.위의 예에서 poodle은 문자열 리터럴로 프로그램 실행 시작 시 작성되어 종료될 때까지 지속되는7 바이트를 가리킵니다.

이렇게 메모리에 저장됩니다.

여기에 이미지 설명 입력

레퍼런스:프로그래밍 러스트 by Jim Blandy, Jason Orendorff, Leonora F. S. Tindall

여기 빠르고 쉬운 설명이 있습니다.

String 가능하고 가능한 힙 구조 - 확장 가능한 힙 할당 데이터 구조.으로 할 .&str.

str는 (가 진화함에 힙 바이너리에 하는 가변 입니다.-( Rust ) 。할 수 것은 「」입니다.str 뷰를 할 수 (예: 스트링 슬라이스 뷰&str.

사용상의 고려사항:

String문자열을 소유하거나 변환하려는 경우(예: 문자열을 다른 스레드에 전달하는 경우)

&str문자열 읽기 전용 보기를 원하는 경우.

언급URL : https://stackoverflow.com/questions/24158114/what-are-the-differences-between-rusts-string-and-str

반응형