2014-09-09 23 views
30

Làm thế nào để tạo cấu trúc với các thành viên chuỗi? Các thành viên nên được sở hữu bởi đối tượng struct. Tôi mới bị rỉ sét, xin lỗi vì câu hỏi đơn giản nhưng tôi không thể tìm thấy một ví dụ. Có một số ví dụ đã lỗi thời bằng cách sử dụng "~" dường như không được dùng nữa ... Tôi đang tìm kiếm khai báo chính xác về cấu trúc và sau đó là ví dụ instantiation.Rust: Cách tạo cấu trúc với các thành viên chuỗi?

+0

Sử dụng 'Chuỗi' và lưu ý rằng việc tạo một' Chuỗi' từ '& str' qua' .to_string() 'liên quan đến phân bổ đống + sao chép toàn bộ chuỗi. – sellibitze

Trả lời

59

Nếu chuỗi phải thuộc sở hữu của cấu trúc, thì bạn nên sử dụng String. Ngoài ra, bạn có thể sử dụng &str với thời gian tồn tại tĩnh (tức là tuổi thọ của chương trình). Ví dụ:

struct Foo { 
    bar: String, 
    baz: &'static str, 
} 

fn main() { 
    let foo = Foo { 
     bar: "bar".to_string(), 
     baz: "baz", 
    }; 
    println!("{}, {}", foo.bar, foo.baz); 
} 

Nếu tuổi thọ của chuỗi là không rõ, sau đó bạn có thể parameterize Foo với một đời người:

struct Foo<'a> { 
    baz: &'a str, 
} 

Và nếu bạn không chắc chắn liệu chuỗi sẽ được sở hữu hay không (hữu dụng để tránh phân bổ), sau đó bạn có thể sử dụng borrow::Cow:

use std::borrow::Cow; 

struct Foo<'a> { 
    baz: Cow<'a, str>, 
} 

fn main() { 
    let foo1 = Foo { baz: Cow::Borrowed("baz") }; 
    let foo2 = Foo { baz: Cow::Owned("baz".to_string()) }; 
    println!("{}, {}", foo1.baz, foo2.baz); 
} 

Lưu ý rằng loại Cow là ov tham số er suốt đời. Vòng đời đề cập đến thời gian tồn tại của được mượn chuỗi (tức là khi nó là Borrowed). Nếu bạn có Cow, thì bạn có thể sử dụng borrow và nhận được &'a str, bạn có thể thực hiện các thao tác chuỗi bình thường mà không phải lo lắng về việc có nên phân bổ chuỗi mới hay không. (Thông thường, gọi điện thoại rõ ràng của borrow không cần vì deref. Cụ thể, giá trị này sẽ Cow deref mẫu mượn của họ tự động. Vì vậy, &*val nơi val có kiểu Cow<'a, str> sẽ sản xuất một &str.)

Cú pháp ~ thực sự là bị phản đối . Việc thay thế cho ~strString, mà bạn có thể coi là bộ đệm chuỗi (tức là nội dung của chuỗi có thể sửa đổi và có thể phát triển được). A &str là một chế độ xem bất biến của chuỗi không thể thay đổi được trong mã an toàn.

+3

Uhhh, cảm ơn bạn đã trả lời đầy đủ. Tôi cần phải suy nghĩ về parametrization suốt đời một ngày :) – vladimir

Các vấn đề liên quan