Rust 什么是;“两个时期”;运算符在方括号内的下标上下文中的平均值?
我在浏览Rust的源代码,以便更好地熟悉该语言。我偶然发现了这个片段Rust 什么是;“两个时期”;运算符在方括号内的下标上下文中的平均值?,rust,Rust,我在浏览Rust的源代码,以便更好地熟悉该语言。我偶然发现了这个片段 // Collect program arguments as a Vec<String>. let cmd: Vec<_> = env::args().collect(); // Some unrelated code omitted here. match subcommand::parse_name(&cmd[1][..]) { // It did some stuff her
// Collect program arguments as a Vec<String>.
let cmd: Vec<_> = env::args().collect();
// Some unrelated code omitted here.
match subcommand::parse_name(&cmd[1][..]) {
// It did some stuff here.
}
这是我所期望的,但我仍然没有得到
[…]
。在这种情况下,它意味着什么?它不只是将cmd
中的第一个字符串作为&str
传递吗?如果是这样,这是否等同于只编写cmd[1]
?他们为什么这样做?这只是一种显式强制从String
到&str
的方法。在这种情况下,[…]
实际上是不必要的,因为Deref
强制意味着parse_name(&args[1])
也是有效的:&String
将隐式借用到&str
[]
索引操作符正在调用trait,。
语法正在创建cmd
是一个Vec
,因为std::env::args()
返回
因此,foo[…]
语法正在调用Index
forString
(您可以在Index
页面上的实现者列表中看到)。下面的示例如下所示:
impl ops::Index<ops::RangeFull> for String {
type Output = str;
#[inline]
fn index(&self, _index: ops::RangeFull) -> &str {
unsafe { mem::transmute(&*self.vec) }
}
}
impl ops::字符串索引{
类型输出=str;
#[内联]
fn索引(&self,_索引:ops::RangeFull)->&str{
不安全{mem::transmute(&*self.vec)}
}
}
&*self.vec
将字符串的内部vec
借用到和[u8]
,然后转换
将其显式转换为&str
,这是安全的,因为字符串的API确保内部vec
是有效的UTF-8,这就是str所需要的。两个句点(。
)是范围运算符。你可以在铁锈书里找到这个。有六种口味:
:1..10
:1..
:.10
:。
:1..=10
:。=10
当没有物品占据末端位置时,该范围将在该方向上“永远”
这与性状相结合(或者,如果需要突变)。在您的示例中,您有一个字符串片段(有点像,请参见下一点),您正在对其应用索引:“foo”[2..]
具体而言,&str
将索引实现为
从字节范围返回给定字符串的一个片段
然后还有第三点人体工程学(或在类似情况下)。通过返回&str
来实现Deref
,因此&str
可用的任何方法都可用于字符串 总之,&cmd[1][..]
翻译成英语,意思是“将cmd
索引1处的字符串中的每个字符作为字符串片段”?是的,这是准确的!从cmd[1]
的开头到cmd[1]
的结尾(含)取一个切片
impl ops::Index<ops::RangeFull> for String {
type Output = str;
#[inline]
fn index(&self, _index: ops::RangeFull) -> &str {
unsafe { mem::transmute(&*self.vec) }
}
}