我想玩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的第一步,所以请不要吝啬我做错了什么.
&是一个指针,它指向其他人拥有的记忆.
所以,&str是一个指向其他人拥有的字符串内存(切片)的指针.
String另一方面,是一个拥有其内存并将字符保存在那里的字符串.
现在,当你创建一个base64时,你会创造一些新的东西,就像听一个钢琴协奏曲并将其捕捉到油画中一样.您可以直接指向原始音乐,而不是拿刷子制作协奏曲的彩绘版本,但是当您特别需要绘制版本时,这将不起作用.同样,当您需要base64版本时,简单地指向原始字符串将不起作用.你需要制作新的东西,你需要一个画布,就是这样String.
你想要做的fn generate_base<'a> (n : &'a str ) -> &'a str就是创作一幅画,摧毁它并指向被毁坏的画作.看看我画的那幅画......只有我把它烧了.这是违反Rust安全规则的,你不应该指出不再存在的东西(它也被称为" 悬空指针 ").
String不是邪恶的,不要害怕String在创造新东西时使用新的东西.
但为什么人们会避免String?这是因为传球String就像传递真实的画作一样.想象一下博物馆将莱昂纳多从墙上带走并送给你:在这里,带上散步,享受吧.现在你已经接受了它,没有其他人会在博物馆里看到它.你必须把它还给你.只需简单地访问博物馆并观察它,就可以更轻松地将其移动到任何地方.