rust学习(8)-关于字符串以及杂项

1 字符串支持转义字符

let z = "foo
bar";
let w = "foo\nbar";
assert_eq!(z, w);

2 字符串字面量前加上r来避免转义

let d: &'static str = r"abc \n abc";
//等价于
let c: &'static str = "abc \\n abc";

3 &str 有copy trait

fn longer<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s1.len() > s2.len(){
        s1
    }else{
        s2
    }
}
fn main() {
    let r;
    {
        let s1 = "rust";
        let s2 = "ecmascript";
        r = longer(s1, s2); //这里用了&str的copy trait,较长的&str拷贝了一个副本,然后副本的所有权转移给了r
    }
    println!("{} is longer", r);//所以这个r既不是s1也不是s2
}
  • 首先看一下str 和 String之间的区别:String是一个可变的、堆上分配的UTF-8的字节缓冲区。而str是一个不可变的固定长度的字符串,如果是从String解引用而来的,则指向堆上,如果是字面值,则指向静态内存。

  • let s = "hello";“hello” 的数据类型是 str,分配在栈区 。变量 s 的数据类型是 &str,其地址、长度都是固定的。String 包含了数据指针、数组容量、数据长度等三个字段,data存在堆区。如果新修改的数据长度在其容量范围内,数据可以原地修改。如果新修改的数据长度超出了容量范围,它可以重新申请更大的内存。

  • 假设当前在本地仓库的a分支,本地仓库的分支a版本较远程仓库的a分支版本低了,git fetch会把远程仓库的更新记录commit id都拉下来,但是不会把版本对应的代码拉下来,所有还需要git pull origin a ,这样就把远程仓库的a分支的较本地a分支的更新代码都拉下来了,同时本地a分支处于最新的commit,这样就可以继续开发了

  • ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。/test.sh 在根目录里找test.sh

猜你喜欢

转载自blog.csdn.net/qq_40642465/article/details/120386843
今日推荐