gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:22:33 24 4
gpt4 key购买 nike

我想玩 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 中的第一步,所以如果我做错了什么,请不要刻意。

最佳答案

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

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

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

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


但为什么人们会避开 String ?这是因为传递String犹如路过真画。想象一下,一家博物馆从墙上取下了达芬奇的作品并将其送给您:在这里,带着它散步,尽情享受吧。既然你拿走了它,其他人就不会在博物馆里看到它了。而你必须归还它。简单地参观博物馆并观看这些东西通常更容易,而无需将其移动到任何地方。

关于string - &str 的生命周期使比较变得困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26913532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com