将String转换为&str的惯用方法是什么?

vbe*_*nar 3 string rust

我发现了许多将String转换为&str的方法.今天哪一个是正确/惯用的?

let string = "hello".to_string();
let string_slice1 = &string[..];
let string_slice2: &str = &string;
let string_slice3 = &*string;
Run Code Online (Sandbox Code Playgroud)

另外我想知道如何在不指定变量声明类型的情况下使#2方法工作?类似的东西&string as &str(但它不起作用).我可以看到&string有&String类型但是当它隐式地转换为&str时,它将执行隐式转换.如何明确转换?

Chr*_*gan 11

这里有两件重要的事情String:

  • Index<RangeFull, Output = str>:这string[..]是类型str,但你需要引用它(通过调用方法,允许autoref发生,或显式为&string[..]).这解释了string_slice1.

  • Deref<Target = str>:这*string是类型的str,对未规范类型的考虑与索引中的考虑相同.这就是为什么string_slice3工作和一些隐藏的行为为什么string_slice2有效.

与C++不同,&它不是纯粹的引用运算符:它还允许首先进行解引用.&string因此通常是类型的&String,但&str如果必要的话也可以是类型.例如,如果您将它传递给采用a的方法,&str它将起作用,或者如果您尝试将其绑定到类型的变量&str.这就是为什么: &str这种情况是必要的.

一般的共识是在可行的情况下应避免使用类型归属,因此第二种形式是不可取的.在第一个和第三个之间,尚未就哪个更令人满意的问题达成共识.

  • 但是,如果不需要类型归属,即在可以推断“&amp;str”的上下文中,例如将参数传递给非泛型函数时,第二种形式就很好。 (2认同)