Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 什么是;“两个时期”;运算符在方括号内的下标上下文中的平均值?_Rust - Fatal编程技术网

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

我在浏览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 here.
}

这是我所期望的,但我仍然没有得到
[…]
。在这种情况下,它意味着什么?它不只是将
cmd
中的第一个
字符串作为
&str
传递吗?如果是这样,这是否等同于只编写
cmd[1]
?他们为什么这样做?

这只是一种显式强制从
String
&str
的方法。在这种情况下,
[…]
实际上是不必要的,因为
Deref
强制意味着
parse_name(&args[1])
也是有效的:
&String
将隐式借用到
&str

[]
索引操作符正在调用trait,
语法正在创建
cmd
是一个
Vec
,因为
std::env::args()
返回

因此,
foo[…]
语法正在调用
Index
for
String
(您可以在
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) }
        }
    }