& str的寿命使得比较变得困难

时间:2014-11-13 16:20:43

标签: string rust

我想玩BasicAuth的东西,因此我需要base64版本的字符串。所以我需要一个函数:String to base_64(String)。

在Rust的字符串指南中,大部分时间$ str优先于String。所以我想适应这个想法。

但与& str一起工作比看上去更难(我知道我的问题与Question also about as_slice()有关)。

其他问题的作者可以通过不使用as_slice()来解决他的问题,有没有办法和我一起使用& str?

extern crate serialize;

use serialize::base64::{ToBase64,MIME};

fn generate_base_string (n : &str) -> String {
    let mut config     = serialize::base64::MIME;
    config.line_length = None;
    let bytes: & [u8]  = n.as_bytes();
    return bytes.to_base64(config);
}

fn generate_base<'a> (n : &'a str ) -> &'a str {
    let mut config     = serialize::base64::MIME;
    config.line_length = None;
    let bytes: & [u8]  = n.as_bytes();
    let res2:  String  = bytes.to_base64(config);
    let res1: &'a str  = res2.as_slice();
    return res1;
}

#[test]
fn right_base64() {
    let trig :&str = generate_base("string");
    assert!(trig=="c3RyaW5n");
}
// http://doc.rust-lang.org/guide-strings.html
#[test]
fn right_base64_string(){
    // A `String` - a heap-allocated string
    assert!(generate_base_string("string")=="c3RyaW5n".to_string());
}

这是我在Rust的第一个宝贝步骤,所以请不要吝啬我做错了什么。

1 个答案:

答案 0 :(得分:6)

&指针,它指向其他人拥有的内存。
因此,&str是指向其他人拥有的字符串内存(切片)的指针 另一方面,String是一个拥有其内存并将字符保存在那里的字符串。

现在,当你创建一个base64时,你会创造一些新的东西,就像听钢琴协奏曲并将其捕捉到油画中一样。您可以将指向原始音乐,而不是拿刷子制作协奏曲的彩绘版本,但是当您特别需要绘制版本时,这将不起作用。同样,当您需要base64版本时,只需将指向指向原始字符串即可。你需要制作新的东西,你需要一个画布,就是String

你在fn generate_base<'a> (n : &'a str ) -> &'a str尝试做的事情类似于创作一幅画,摧毁它并指向被毁坏的画作。看看我画的那幅画......只有我把它烧了。那是违反Rust安全规则的,你不应该指出不再存在的东西(它也被称为“dangling pointer”)。

String不是邪恶的,在你创造新事物时不要害怕使用新的String


但为什么人们会避免String?这是因为传递String就像传递真实的画作一样。想象一下博物馆将莱昂纳多从墙上带走并送给你:在这里,带上散步,享受吧。现在你已经接受了它,没有其他人会在博物馆里看到它。你必须把它还给你。只需简单地访问博物馆并观察它就可以更容易,而无需移动它。