【编程】Rust语言入门第4篇 字符串

这篇具有很好参考价值的文章主要介绍了【编程】Rust语言入门第4篇 字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Rust 中的字符是 Unicode 类型,因此每个字符占据 4 个字节内存空间,但字符串不一样,字符串是 UTF-8 编码,也就是字符串中的字符所占的字节数是变化的(1 - 4)。
常见的字符串有两种:

  1. str,通常是引用类型,&str,即字符串字面常量,字符串切片。
  2. std::string::String
    类型&str的变量是被硬编码的,快速而高效,但不可变;类型String,是可设可变的,它是在堆上的变量,如何管理内存,有的语言用垃圾回收机制(Garbage Collection),标记使用情况并自动清理;而Rust不愿意用GC,既要高性能,又要高安全性,提出变量离开作用域即自动释放其占用的内存,比GC思路更妙。
    C语言中清理内存的函数free,要被手动调用;Rust中则是drop(),Rust自动调用。
    C++中的Resoure Acquisition Is Initialization,RAII模型。

两种字符串类型互转

&strString:

let a = String::from("hello, world");
"hello, world".to_string();

String&str,引用即可

fn main() {
    let s = String::from("hello,world!");
    say_hello(&s);
    say_hello(&s[..]);
    say_hello(s.as_str());
}

fn say_hello(s: &str) {
    println!("{}",s);
}

除上述两种类型,Rust标准库还有其他类型的字符串。

字符串不能被直接索引

Rust字符串不允许索引操作。由于不同字符占用字节数不等,考虑操作时间复杂度不能实现O(1)。

//三个字节
let a = "中国人";
//一个字节
let b = "Chinese";

Rust字符串虽然不能索引但可以切片(slice),类似Python等语言中的切片概念。

fn main() {
    let my_name = "kirk zhang";
    let first_name = &my_name[0..4];
    let last_name = &my_name[5..10];
    println!("{}",first_name);
    println!("{}",last_name);
    greet(String::from(my_name));
    // 尝试my_name[0]报错,不过可以用.chars().nth或.bytes()来实现
    println!("can str be indexed {:?}",my_name.chars().nth(0));
}

fn greet(name: String){
    println!("hello {}", name);
}

小心字符串切片

注意字符串切片是按字节来的哦,而Rust字符串是UTF-8协议格式,一般1个字符1个字节,但1个中文字符占3个字节;如果切片起止不在字符边界,则有异常。

fn main(){
    let f = "中国人";
    let f1 = &f[0..5];
    println!("watch out, what you got {}",f1);
}

提示:thread ‘main’ panicked at ‘byte index 5 is not a char boundary; it is inside ‘国’ (bytes 3…6) of 中国人’, src/main.rs:10:15
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

字符串的操作

替换

replace(要被替换的子串,新字符串),返回结果字符串。

    let word = String::from("rust");
    let new_word = word.replace("r","R");
    println!("{}", new_word);

插入

insert(位置索引,字符)、insert_str(位置索引,字符串):变量本身变化,声明时要mut。

    let word = String::from("rust");
    let mut new_word = word.replace("r","R");
    new_word.insert_str(0, "I love ");
    println!("{}", new_word);

追加

push(字符)
push_str(字符串)

    let word = String::from("rust");
    let mut new_word = word.replace("r","R");
    new_word.insert_str(0, "I love ");
    new_word.push('!');
    println!("{}", new_word);   

连接

++= 调用了String的add(self,&str)方法,其定义要求+后面的参数为字符串字面常量,返回String类型。
或用format! ,适用于 String 和 &str 。format! 的用法与 println! 的用法类似。

let a1 = String::from("tic");
let a2 = String::from("tac");
let a3 = String::from("toe");

// 经过下面一行后,a1被释放了,不能再使用!a2、a3依然存在。
let s = s1 + "-" + &s2 + "-" + &s3;

删除

有4个方法,pop()、remove(索引位置)、truncate(起始位置)、clear()
注意删除字符串的索引必须是字符串中字符的边界,否则错误。

fn main() {
    let mut string_remove = String::from("测试remove方法");
    println!(
        "string_remove 占 {} 个字节",
        std::mem::size_of_val(string_remove.as_str())
    );
    // 删除第一个汉字
    string_remove.remove(0);
    // 下面代码会发生错误
    // string_remove.remove(1);
    // 直接删除第二个汉字
    // string_remove.remove(3);
    dbg!(string_remove);
}

字符串的字符与字节

例,文章来源地址https://www.toymoban.com/news/detail-829519.html

   for c in "中国人".chars() {
       println!("{}", c);
   }
   for b in "中国人".bytes() {
       println!("{}", b);
   }

到了这里,关于【编程】Rust语言入门第4篇 字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rust 字符串(String)详解

    rust中的 String ,是一个非常常用的 crate ,它的底层涉及到了rust中的所有权概念,不过这不是本章的内容,如果对rust所有权概念感兴趣的,可以查看另一篇文章:rust所有权 本文的目的还是介绍 String 的基本用法,以及有哪些常用的函数可以使用 字符串,也就是由一系列字符

    2024年02月03日
    浏览(46)
  • 30天拿下Rust之字符串

    概述         在Rust中,字符串是一种非常重要的数据类型,用于处理文本数据。Rust的字符串是以UTF-8编码的字节序列,主要有两种类型:str和String。其中,str是一个对字符数据的不可变引用,更像是对现有字符串数据的“视图”,而String则是一个独立、可变更的字符串实

    2024年03月12日
    浏览(46)
  • rust里如何判断字符串是否相等呢?

    在 Rust 中,有几种方法可以判断字符串是否相等。下面是其中几种常见的方法: 使用 == 运算符:可以直接使用 == 运算符比较两个字符串是否相等。例如: 这段代码会输出 “字符串不相等”,因为 str1 和 str2 不是相同的字符串。 2. 使用 eq 方法:字符串类型实现了 PartialEq

    2024年02月14日
    浏览(62)
  • 算法leetcode|87. 扰乱字符串(rust重拳出击)

    使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 1 ,执行下述步骤: 在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。 随机

    2024年02月05日
    浏览(43)
  • Rust字符串:安全、高效和灵活的数据类型

    Rust是一种现代的系统级编程语言,以其出色的内存安全性和高性能而受到广泛关注。在Rust中,字符串是一种重要的数据类型,它具有独特的特点,使其在处理文本和字符数据时成为理想的选择。本文将深入探讨Rust字符串的特性,包括安全性、高效性和灵活性,以帮助您更好

    2024年01月19日
    浏览(53)
  • Rust中的字符串处理及相关方法详解

    在Rust中,字符串是一种非常重要的数据类型,而 String 类型则提供了对动态可变字符串的支持。本文将介绍一些常见的字符串处理方法以及相关示例代码。 在Rust中,有多种方式创建字符串,以下是一些常见的例子: push_str()方法 push_str() 方法用于将一个字符串切片附加到 S

    2024年02月19日
    浏览(35)
  • 没有jodatime,rust里怎么将字符串转为日期呢?

    在 Rust 中,有多种方法可以在时间和字符串之间进行转换。以下是五种常见的方式:

    2024年02月14日
    浏览(33)
  • Rust 标准库字符串类型String及其46种常用方法

    Rust主要有两种类型的字符串:str和String str 由[u8]表示,UTF-8编码的字符串的引用,字符串字面值,也称作字符串切片。&str用于查看字符串中的数据。它的大小是固定的,即它不能调整大小。 String String 类型来自标准库,它是可修改、可变长度、可拥有所有权的同样使用UTF

    2024年02月07日
    浏览(98)
  • Rust每日一练(Leetday0029) 柱状图、最大矩形、扰乱字符串

    目录 84. 柱状图中最大的矩形 Largest-rectangle-in-histogram  🌟🌟🌟 85. 最大矩形 Maximal Rectangle  🌟🌟🌟 87. 扰乱字符串 Scramble String  🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给定  n

    2024年02月09日
    浏览(48)
  • 【零基础学Rust | 基础系列 | 数据结构】元组,数组,向量,字符串,结构体

    在Rust编程语言中,数据结构是组织和存储数据的一种方式,它们使得数据可以高效地被访问和操作。本章将详细介绍元组,数组,向量,字符串,和结构体这几种基本的数据结构。 元组是Rust编程语言中的一种复合数据类型,它可以包含多个值,这些值可以是不同类型。元组

    2024年02月11日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包