Rust和golang之字符串

Rust

Rust 的核心语言中只有一种字符串类型:str,字符串 slice,它通常以被借用的形式出现,&str。 字符串 slice:他们是一些储存在别处的 UTF-8 编码字符串数据的引用。

称作 String 的类型是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。当 Rust开发者 们谈到 Rust 的 “字符串”时,他们通常指的是 String 和字符串 slice &str类型,而不是其中一个。这一部分大部分是关于 String 的,不过这些类型在 Rust 标准库中都被广泛使用。String 和字符串 slice 都是 UTF-8 编码的。

赋值

在《Rust程序设计语言》中变量与数据的交互的方式(一):移动使用了如下实例,

fn main() {
    println!("Hello, world!");
    let s1 = String::from("hello");
    let s2 = s1;
    println!("{}",s2);
    // println!("{}",s1);
    // let s3 = s2.clone();
    // println!("{}{}",s3,s2);
}

强调了Rust语言的特异点
1. Rust认为s1不再有效,故执行s2=s1之后尝试获取s1的值会报错

error[E0382]: use of moved value: `s1`
 --> src/main.rs:6:19
  |
4 |     let s2 = s1;
  |         -- value moved here
5 |     println!("{}",s2);
6 |     println!("{}",s1);
  |                   ^^ value used here after move
  |
  = note: move occurs because `s1` has type `std::string::String`, which does not implement the `Copy` trait

这个操作被称为“移动”,而不是浅拷贝。

而对于整型这样的在编译时已知大小的类型被整个存储在栈上,所以旧的整型变量在重新赋值后依然可用。

取子串

    let s = String::from("kingeasternsun");
    let firstname = &s[0..4];
    let secondname = &s[4..];
    println!("{}",firstname);
    println!("{}",secondname);

使用..进行取子串的操作,需要注意的是由于String的移动特性,所以要在s前加&.
这里写图片描述

注意前面的警告,原因时我在代码里定义了一个Rectangle的结构体没有使用,Rust中如果定义了一个结构体但是没有使用会报警告,结构体后续会详细介绍。

使用 push 附加字符串

可以通过 push_str 方法来附加字符串 slice,从而使 String 变长:

let mut s = String::from("foo");
s.push_str("bar");

执行这两行代码之后 s 将会包含 “foobar”。push_str 方法获取字符串 slice,因为并不需要获取参数的所有权。例如,如果将 s2 的内容附加到 s1 中后自身不能被使用就糟糕了:

let mut s1 = String::from("foo");
let s2 = String::from("bar");
s1.push_str(&s2);

push 方法被定义为获取一个单独的字符作为参数,并附加到 String 中:

let mut s = String::from("lo");
s.push('l');

执行这些代码之后,s 将会包含 “lol”。

使用 + 运算符或 format! 宏级联字符串
通常我们希望将两个已知的字符串合并在一起。一种办法是像这样使用 + 运算符:

let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; // Note that s1 has been moved here and can no longer be used

执行完这些代码之后字符串 s3 将会包含 Hello, world!。

字符串遍历

如果你需要操作单独的 Unicode 标量值,最好的选择是使用 chars 方法。对 “नमस्ते” 调用 chars 方法会将其分开并返回六个 char 类型的值,接着就可以遍历结果来访问每一个元素了:

for c in "नमस्ते".chars() {
    println!("{}", c);
}

这些代码会打印出如下内容:

न
म
स
्
त
े

bytes 方法返回每一个原始字节,这可能会适合你的使用场景:

for b in
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值