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

时间:2018-03-16 07:12:19

标签: 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);
}

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

Hey you
Hey String
12345
"String"

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

当我将&添加到String并且它变为&str时,我不明白它是如何工作的。

1 个答案:

答案 0 :(得分:8)

您刚刚目睹了Deref特质。这个特性有三个用途:

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

在您的情况下,由于String实施Deref<Target = str>,这意味着&s被强制转换为&str

更多信息here