我找到了多种转换方法String
to &str
。今天哪一个是正确/惯用的?
let string = "hello".to_string();
let string_slice1 = &string[..];
let string_slice2: &str = &string;
let string_slice3 = &*string;
如果在变量声明中不指定类型,如何使第二种方法起作用?就像是&string as &str
(但它不起作用)。我看到&string
has &String
类型,但当它被隐式转换为&str
,它将执行隐式转换。如何使该转换明确?
这里有两件重要的事情String
实现:
Index<RangeFull, Output = str>
: 这使得string[..]
属于类型str
,尽管您需要引用它(通过调用方法,允许 autoref 发生,或者显式地作为&string[..]
)。这解释了string_slice1
.
Deref<Target = str>
: 这使得*string
属于类型str
,对未调整大小的类型的考虑与索引中相同。这就是为什么string_slice3
有效并且有一些隐藏的行为为什么string_slice2
works.
与 C++ 不同,&
不是纯引用运算符:它还允许首先进行取消引用。&string
因此通常是类型&String
,但它可能是这样的类型&str
如果需要的话也可以。例如,如果您要将其传递给一个采用&str
,它会起作用,或者如果您尝试将其绑定到类型的变量&str
。这就是为什么: &str
对于这种情况是必要的。
普遍的共识是,在可行的情况下应避免类型归属,因此第二种形式是不可取的。在第一个和第三个之间,对于哪个更可取尚未达成共识。
还有String::as_str https://doc.rust-lang.org/std/string/struct.String.html#method.as_str,有些人更喜欢:
let string_slice4 = string.as_str();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)