Rust官方的解释:
“String 是一个被拥有(owned)的在堆上分配的 UTF-8 的字节缓冲区。可变 String 可以被修改,根据需要增加其容量。

&str 是一个指向分配在某处的 String 的一个固定容量的「视图」。如果切片是在从 String 解引而来的,则通常是指向在堆上,如果是字符串字面值,则指向静态内存。

&str 是一个由 Rust 语言实现的原生类型,而 String 则是由标准库实现的。”

对于Rust而言,“字符串”是 Unicode 标量值的序列编码为 utf - 8 字节的流。所有字符串都必须保证为有效的 utf-8 编码序列。

但,不止这些,Rust关于字符串的处理有些个性。

let a ="hello world";
let b ="ok!";

1、字面的“字符串”是&str

a、b都是&str,不是String.对Rust而言,&str更象一个固定的数组;String更象一个可变的数组; 

2、实现&str =>String的转换

let c =a.to_string(); //方法一let d =String::from(b) //方法二或let d =a.to_owned();

3、实现String =>&str 的转换: 加一个&

let e = &String::from("hello world"); 或 使用as_str();let e_0 = String::from("hello world");
let e   = e_0.as_str();但:不可以直接
let e =String::from("hello world").as_str(); 

4、一个String+一个&str =>String

注意,首要的要是String,后面可以接N个&str.

let f = c+b;
或let f =c+b+e;//增加一个也可以
let g = c.clone()+b+e

当然,另外的方法是:push_str()

let mut strs = "hello".to_string();strs.push_str(" world!"); // hello world!println!("state1 :{:?}", strs);let mut s = String::from("foo");s.push_str("bar"); //foobarprintln!("{:?}", s);

5、两个或多个String 如何变成一个String?

let h = c +&d; // 如果要多个,比如:
let h =c +&d +&String::from("great!"); 

let i = c.clone()+ &d;//意义不大

let j = format!("{0}{1}", a, b);

6、比如,一个f32,一个String,要变成新的String,

let num =2008_u32;
let mystr =String::from(" ,happy new year!");
let num_str = format!("{0}{1}", num, mystr);//2008 ,happy new year!推荐这种方式,比较方便,灵活性也比较强。其它方式也可以。let num1 =200_u32;
let num2 =8_u32;
let mystr2 ="f32"
let new_num_str =format!("{0}{1}_{2}",num1,num2,mystr2);//2008_f32

7、关于as_bytes(); chars();

这里想提醒一下的是,字符和byte并不是简单一一对应的。

    let love_china = "忠犬ハチ公";for (num, bt) in love_china.as_bytes().iter().enumerate() {println!("length:{:?} num:{:?} byte:{:?}", love_china.len(), num, bt);}for (num, ch) in love_china.chars().enumerate() {println!("length:{:?} num:{:?} char:{:?}", love_china.len(), num, ch);}

8、slice, []

&str,String都不能直接进行slice.

    let mystr:&str = "abcd";let my_str:String = "ABCD".to_string();//println!("mystr :{:?}", mystr[1..]);   =>errorprintln!("mystr :{:?}", &mystr[1..2]);   //"bc"println!("mystr :{:?}", &mystr[1..]);   //"bcd"println!("mystr :{:?}", &mystr[..]);    // "abcd"//很显然,String不能直接进行slice//println!("my_str :{:?}", my_str[1..]);  =>errorprintln!("my_str :{:?}", &my_str[1..2]); //"BC"println!("my_str :{:?}", &my_str[1..]); //"BCD"println!("my_str :{:?}", &my_str[..]);  //"ABCD"

9、关于&str内部的地址

let mystr :&str = "abcd";
println!("mystr  address:  {:p}", &mystr[1..]);//从第2个开始
println!("mystr  address:  {:p}", &mystr[2..]);
println!("mystr  address:  {:p}", &mystr[3..]);

output:

mystr  address:  0x7ff6ffcd0612
mystr  address:  0x7ff6ffcd0613
mystr  address:  0x7ff6ffcd0614

大家发现什么?

10、extend: String聚合 char

    let mut message = String::from("The first three letters are: ");message.extend(&['a', 'b', 'c']);println!("message:{:?}", message);//message:"The first three letters are: abc"

11、String的内存分布

let s1 =String::from("hello");

Rust: String 与 str相关推荐

  1. 一文解决Rust字符串:String,str,String,str,CString,CStr

    一.str和&str和String的区别 1.存放位置,可变不可变: str来源于Rust本身的数据类型,而String类型来自于标准库.首先看一下str 和 String之间的区别:Stri ...

  2. rust 中的 String 和 str

    1. str 和 &str 看下面的代码: let s = "hello"; 其中,"hello" 的数据类型是 str,变量 s 的数据类型是 &am ...

  3. java trim all,[JAVA中各种去除空格][java string.trim()][str.replaceAll去空格]

    有时候去除空格是件很烦的事,去空格我们也要详细了解一下他们的功能等,下面就罗列一下各个方法吧! 1. String.trim() trim()是去掉首尾空格 2.str.replace(" ...

  4. stl:string:将str中的oldstr替换为newstr

    //将str中的oldstr替换为newstr void replace(string &str,string oldstr,string newstr) {int pos=string::n ...

  5. Rust 标准库字符串类型String及其46种常用方法

    Rust字符串 Rust主要有两种类型的字符串:&str和String &str 由&[u8]表示,UTF-8编码的字符串的引用,字符串字面值,也称作字符串切片.&st ...

  6. 【初级】String str= ac,42,123,sd Fa,c df,4,acdf,5ewRRre ;1.把字符串按,进行分割

    第7题做的不好... package HomeWork;import java.util.Arrays;/*3. String str=" ac,42,123,sd Fa,c df,4,ac ...

  7. 将字符串String str= “abc god 中国 java“ 反转每个单词 结果: “cba dog 国中

    /*** String str= "abc god 中国 java"(较难) 反转每个单词结果: "cba dog 国中 avaj"**/ public cla ...

  8. 定义类MyProgram,包含两个属性:一个是private的整型属性data、一个是private的String类型属性str,重写toString,equals

    题目: 定义一个类MyProgram,包含两个属性:一个是private的整型属性data.一个是private的String类型属性str,封装这两个属性的四个方法setData( )和getDat ...

  9. 10玩rust_有趣的 Rust 类型系统: Trait

    也许你已经学习了标准库提供的 String 类型,这是一个 UTF-8 编码的可增长字符串.该类型的结构为: pub struct String {vec: Vec<u8>, } UTF- ...

  10. rust(54)-字符串

    Rust有两种类型的字符串:String 和&str. String 存储为字节向量(Vec),但保证始终是有效的UTF-8序列.字符串是堆分配的,可增长的,不以空null 结束. & ...

最新文章

  1. redis怎么不让存byte_redis用bitfield存储的问题
  2. python执行shell脚本、执行mongodb_Mongo shell 的基本操作和 Python shell 中使用 MongoDB...
  3. Gerrit的用法及与gitlab的区别
  4. PHP ctf addslashes,[红日安全]代码审计Day13 - 特定场合下addslashes函数的绕过
  5. ADO.NETv2.0的一些特征
  6. 一款免费的网络时间校准小程序
  7. php 如何执行top命令,批处理模式下运行 top 命令的方法
  8. Vissim与python(IntelliJ IDEA )联调环境配置
  9. js存取cookie以及设置cookie储存时间
  10. 2022年全球与中国网络处理器市场现状及未来发展趋势
  11. 有限元分析能具体做什么?
  12. 闲聊机器人实例二:python实现小姜机器人(检索式chatbot_fuzzywuzzy)
  13. 设备出现无法访问故障,单向能ping通问题排查解决过程
  14. Android中获取唯一的id
  15. 高德地图 自定义marker+信息窗口
  16. 有被惊艳到!阿里达摩院面向开发者公布的Java全体系成长路线,从P5-P8职级全系
  17. FileDownloader-Android 文件下载引擎,稳定、高效、简单易用
  18. Summary Writer的使用
  19. 整理 酷炫 Android 开源UI框架 动画
  20. Fluke ADPT连接器给福禄克万用表插上翅膀----电阻测量

热门文章

  1. 转iOS逆向工程:Reveal查看任意app的高级技巧!
  2. Intergate flot with Angular js ——Angular 图形报表
  3. 易飞ERP系统平台故障
  4. Ubuntu 10.04的安装
  5. oracle表中多个字段同时和另一个表中关联解决办法
  6. Java-集合第一篇认识Java集合
  7. 现博客已搬至简书(https://www.jianshu.com/u/6639243cadf1)
  8. Codeforces Round #436 (Div. 2) B. Polycarp and Letters
  9. 令人眼前一亮的下拉式终端 Tilda Guake
  10. sql 操作常用操作语句 新增、修改字段等