我发现了许多将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这种情况是必要的.
一般的共识是在可行的情况下应避免使用类型归属,因此第二种形式是不可取的.在第一个和第三个之间,尚未就哪个更令人满意的问题达成共识.
| 归档时间: |
|
| 查看次数: |
3455 次 |
| 最近记录: |