如何对String的引用成为字符串切片?

Raj*_*jan 3 rust

我试图理解字符串和字符串切片的概念.

fn say_hello_slice(slice: &str) {
    println!("Hey {}", slice);
}

fn say_hello_string(string: &String) {
    println!("{:?}", string);
}

fn print_int(int_ref: &i32) {
    println!("{:?}", int_ref);
}

fn main() {
    let slice: &str = "you";
    let s: String = String::from("String");
    say_hello_slice(slice);
    say_hello_slice(&s);

    let number: i32 = 12345;
    print_int(&number);

    say_hello_string(&s);
}
Run Code Online (Sandbox Code Playgroud)

编译运行时,该程序给出以下输出:

Hey you
Hey String
12345
"String"
Run Code Online (Sandbox Code Playgroud)

据我所知,当&添加到绑定时,它将成为对其绑定类型的引用.例如,&number在上面的程序中变&i32.

我不明白它是如何工作当我添加&String它变成&str.

小智 9

你刚刚目睹了这个Deref特质.这个特性有三个用途:

  • 解除引用时转换为另一种类型(*运算符)
  • 借用时必要时自动转换(胁迫)
  • 您可以直接调用其他类型的方法.

在你的情况下,因为String实现Deref<Target = str>这意味着&s被强制成一个&str.

更多信息在这里.