The rust String  is a growable, mutable, owned, UTF-8 encoded string type.

&str ,切片,是按UTF-8编码对String中字符的一个引用,不具有owned。

不具有owner关系,是非常非常重要的一区别,看下面代码

pub fn test1(){
//"abc"是 &str 切片类型
let s1 = "abc";
let s2 = s1;
//如果切片具体owner,则下面的语句必报错; 实际上下面的语句是可以正常运行的。
println!("{}",s1);
println!("{}",s2);
} pub fn test2(){
let s1 = String::from("abcd");;
let s2 = s1; //由于s1的owner已经转移给s2,下面再使用s1则会报错
// println!("{}",s1);
println!("{}",s2);
} pub fn test3(){
let s1 = String::from("abcd"); //取s1的切片则没有关系
let s2 = s1.as_str();
println!("{}",s1); println!("{}",s2);
}

切片转String

 let fil: String= "/tmp/hello.txt".to_string();
还有一个方法叫into_string(),多了一个in,in是进入的意思,let B = A.into_string();
就是A进到B里去了
在rust中就是ownership的转换,

首先, A得具有ownership,像切片这种类型本身是另外一个类型的片段数据,没有ownership,就没法用into_string这个方法
切片的传值、传参,只能是将自己指向的地址传递过去,让另外一个变量指向自己指向的地址,所有切片传参一定是这样的 aaa(&name),有一个&

然后,
let B = A.into_string();
调用之后,A就不能再用了,以后生效的只有B

它们的方法定义

to_string:

fn to_string(&self) -> String;

into_string:

fn into_string(self) -> String;
关于它们的不同,这里说的更详细

#[stable(feature = "box_str", since = "1.4.0")]
#[inline]
pub fn into_string(self: Box<str>) -> String {
let slice = Box::<[u8]>::from(self);
unsafe { String::from_utf8_unchecked(slice.into_vec()) }
}
#[stable(feature = "rust1", since = "1.0.0")]
impl ToOwned for str {
type Owned = String;
#[inline]
fn to_owned(&self) -> String {
unsafe { String::from_utf8_unchecked(self.as_bytes().to_owned()) }
} fn clone_into(&self, target: &mut String) {
let mut b = mem::take(target).into_bytes();
self.as_bytes().clone_into(&mut b);
*target = unsafe { String::from_utf8_unchecked(b) }
}
}


3.6 String 与 切片&str的区别的更多相关文章

  1. JSON.parseObject(String str)与JSONObject.parseObject(String str)的区别

    一.首先来说说fastjson fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发.其主要特点是: ① 快速:fastjson采用独创的算法, ...

  2. String、StringBuffer、StringBuilder区别

    String.StringBuffer.StringBuilder区别 StringBuffer.StringBuilder和String一样,也用来代表字符串.String类是不可变类,任何对Str ...

  3. String和StringBuffer有什么区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  4. String s;和String s=null;和String s="a";有什么区别?

    String s;和String s=null;和String s="a";有什么区别?   针对这三种情况,使用out.println(s);的时候,第一个会出现异常,第二个会输 ...

  5. String[]和ArrayList和LinkedList区别

    String[]和ArrayList和LinkedList区别 参考文档如下: http://www.blogjava.net/flysky19/articles/92775.html http:// ...

  6. StringBuilder、StringBuffer和String三者的联系和区别(转)

    StringBuilder.StringBuffer和String三者的联系和区别 1. String 类    String的值是不可变的,这就导致每次对String的操作都会生成新的String对 ...

  7. final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?

    继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...

  8. bytes和str的区别与转换

    bytes和str的区别 1.英文 b'alex'的表现形式与str没什么两样 2.中文 b'\xe4\xb8\xad'这是一个汉字在utf-8的bytes表现形式 3.中文 b'\xce\xd2'这 ...

  9. JAVA基础之——String、StringBuilder、StringBuffer区别和使用场景

    本文主要讲解String.StringBuilder.StringBuffer区别和应用场景 本文以jdk1.8为例 1 String 操作过程:每次赋值时新建一个String对象. 2 String ...

随机推荐

  1. Trap (陷入/中断) 源码解析

    用户空间和内核空间之间的切换通常称为trap trap的三种形式 系统调用引发 异常发生 设备中断 (时间中断.IO中断.网络中断等) supervise mode的权限 用户态和内核态之间的到底有什 ...

  2. docker 加入域名

    先运行docker镜像 # 进入 docker 容器 mynginx 是容器名 docker exec -i -t mynginx /bin/bash #安装vim apt-get install v ...

  3. 【java+selenium3】Tesseract-OCR识别图片验证码 (十六)

    [java+selenium+Tesseract-OCR(图片识别)+AutoIt(windows窗口识别)]完成自动化图片验证码识别! 一.AutoIt(windows窗口识别)参考:https:/ ...

  4. robot framework error: [ ERROR ] Suite 'XXX' contains no tests or tasks.(解决方法)

    robot framework 按照如下操作创建项目 一.创建项目 选择菜单栏file----->new Project Name 输入项目名称. Type 选择Directory. 二.创建测 ...

  5. 子查询之 exists 和 in

    exists exists用于检查一个子查询是否至少会返回一行数据(即检测行的存在),返回值为boolean型,true或false 语法 exists subquery /* 参数: subquer ...

  6. PTA 7-3 树的遍历 (25分)

    PTA 7-3 树的遍历 (25分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点 ...

  7. C++ STL的一些应用

    STL一些应用 记录一些STL算法在开发中用得比较舒服的情况(不断添加...) lower_bound(begin,end,val)算法 算法说明 查找>=val的第一个元素,如果没有,返回en ...

  8. Mysql - date、datetime、timestamp 的区别

    date.datetime 的区别 顾名思义,date 日期,datetime 日期时间,所以 date 是 datetime 的日期部分 MySQL 以 YYYY-MM-DD hh:mm:ss 格式 ...

  9. 用户登录成功后重新获取新的Session

    HttpSession session = request.getSession();            // 用来存储原sessionde的值            ConcurrentHash ...

  10. vi/vim 常用命令总结

    目录 Linux vi/vim编辑 vim键盘图 vim的三种模式 命令模式.输入模式.输出模式 vim使用实例 vi/vim按键说明 第一部分:一般模式可用的光标移动.复制粘贴.搜索替换等 第二部分 ...