Rust从入门到实战系列二百六十九:&str 和 String

与 str 的很少使用相比, &str 和 String 类型却非常常用,因此也非常重要。
7. 🌟🌟 我们可以使用两种方法将 &str 转换成 String 类型
// 使 用 至 少 两 种 方 法 来 修 复 错 误
fn main() {
let s = “hello, world”;
greetings(s)
}
fn greetings(s: String) {
println!(“{}”,s)
}
8. 🌟🌟 我们可以使用 String::from 或 to_string 将 &str 转换成 String 类型
// 使 用 两 种 方 法 来 解 决 错 误 , 不 要 新 增 代 码 行
fn main() {
let s = “hello, world”.to_string();
let s1: &str = s;
}
字符串转义
9. 🌟
fn main() {
// 你 可 以 使 用 转 义 的 方 式 来 输 出 想 要 的 字 符 , 这 里 我 们 使 用 十 六 进 制 的 值 , 例 如 \x73 会 被 转 义
// 填 空 以 输 出 “I’m writing Rust”
let byte_escape = “I’m writing Ru\x73__!”;
println!(“What are you doing\x3F (\x3F means ?) {}”, byte_escape);
// 也 可 以 使 用 Unicode 形 式 的 转 义 字 符
let unicode_codepoint = “\u{211D}”;
let character_name = ““DOUBLE-STRUCK CAPITAL R””;
println!(“Unicode character {} (U+211D) is called {}”,
unicode_codepoint, character_name );
// 还 能 使 用 \ 来 连 接 多 行 字 符 串
let long_string = “String literals
can span multiple lines.
The linebreak and indentation here
can be escaped too!”;
println!(“{}”, long_string);
}
10. 🌟🌟🌟 有时候需要转义的字符很多,我们会希望使用更方便的方式来书写字符串: raw string.
/* 填 空 并 修 复 所 有 错 误 */
fn main() {
let raw_str = r"Escapes don’t work here: \x3F \u{211D}“;
// 修 改 上 面 的 行 让 代 码 工 作
assert_eq!(raw_str, “Escapes don’t work here: ? ℝ”);
// 如 果 你 希 望 在 字 符 串 中 使 用 双 引 号 , 可 以 使 用 以 下 形 式
let quotes = r#“And then I said: “There is no escape!””#;
println!(”{}“, quotes);
// 如 果 希 望 在 字 符 串 中 使 用 # 号 , 可 以 如 下 使 用 :
let delimiter = r###“A string with “# in it. And even “##!”###;
println!(”{}”, delimiter);
// 填 空
let long_delimiter = __;
assert_eq!(long_delimiter, “Hello, “##””)
}
字节字符串
想要一个非 UTF-8 形式的字符串吗(我们之前的 str , &str , String 都是 UTF-8 字符串) ? 可以试试字节
字符串或者说字节数组:
示例:
use std::str;
fn main() {
// 注 意 , 这 并 不 是 &str 类 型 了 !
let bytestring: &[u8; 21] = b"this is a byte string”;
// 字 节 数 组 没 有 实 现 Display 特 征 , 因 此 只 能 使 用 Debug 的 方 式 去 打 印
println!(“A byte string: {:?}”, bytestring);
// 字 节 数 组 也 可 以 使 用 转 义
let escaped = b"\x52\x75\x73\x74 as bytes";
// …但 是 不 支 持 unicode 转 义
// let escaped = b"\u{211D} is not allowed";
println!(“Some escaped bytes: {:?}”, escaped);
// raw string
let raw_bytestring = br"\u{211D} is not escaped here";
println!(“{:?}”, raw_bytestring);
// 将 字 节 数 组 转 成 str 类 型 可 能 会 失 败
if let Ok(my_str) = str::from_utf8(raw_bytestring) {
println!(“And the same as text: ‘{}’”, my_str);
}
let _quotes = br#“You can also use “fancier” formatting,
like with normal raw strings”#;
// 字 节 数 组 可 以 不 是 UTF-8 格 式
let shift_jis = b"\x82\xe6\x82\xa8\x82\xb1\x82\xbb"; // “よ う こ そ” in SHIFT-JIS
// 但 是 它 们 未 必 能 转 换 成 str 类 型
match str::from_utf8(shift_jis) {
Ok(my_str) => println!(“Conversion successful: ‘{}’”, my_str),
Err(e) => println!(“Conversion failed: {:?}”, e),
};
}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值