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