&str的生命周期使得比较困难

tks*_*idt 0 string rust

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

在Rust的字符串指南中,大多数时候$ str优先于String.所以我想适应这个想法.

但是使用&str在某种程度上比它看起来更难(我知道我的问题也与问题有关as_slice()).

其他问题的作者可以通过不使用as_slice()解决他的问题,有没有办法继续使用&str for me?

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());
}
Run Code Online (Sandbox Code Playgroud)

这是我在Rust的第一步,所以请不要吝啬我做错了什么.

Art*_*mGr 6

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

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

你想要做的fn generate_base<'a> (n : &'a str ) -> &'a str就是创作一幅画,摧毁它并指向被毁坏的画作.看看我画的那幅画......只有我把它烧了.这是违反Rust安全规则的,你不应该指出不再存在的东西(它也被称为" 悬空指针 ").

String不是邪恶的,不要害怕String在创造新东西时使用新的东西.


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