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

时间:2015-03-13 06:22:02

标签: string rust

我找到了很多将String转换为& str的方法。今天哪一个是正确/惯用的?

let string = "hello".to_string();
let string_slice1 = &string[..];
let string_slice2: &str = &string;
let string_slice3 = &*string;

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

1 个答案:

答案 0 :(得分:9)

String实现了两件重要的事情:

  • Index<RangeFull, Output = str>:这会使string[..]属于str类型,但您需要对其进行引用(通过调用方法,允许autoref发生,或者明确地为&string[..])。这解释了string_slice1

  • Deref<Target = str>:这会使*string属于str类型,对未归类类型的考虑与对索引的考虑相同。这就是string_slice3有效的原因,也是string_slice2工作原因的隐藏行为。

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

普遍的共识是在可行的情况下应避免使用类型归属,因此第二种形式是不可取的。在第一个和第三个之间,尚未就哪个更为理想达成共识。