为什么从字符串长度开始的切片不会出现混乱?

时间:2018-08-27 08:46:37

标签: syntax rust

if (!azureutil.isBrowser() ||
!browserFile ||
!browserFile.constructor ||
(!azureutil.isIE() && !browserFile.constructor.name) ||
(!azureutil.isIE() && browserFile.constructor.name !== 'File' && browserFile.constructor.name !== 'Blob') ||
!azureutil.objectIsInt(browserFile.size)) {
return fail(new ArgumentError('type', 'Invalid HTML File object.'));
} else {
callback();
return true;
}

为什么这段代码运行时不会出现紧急情况?我认为这是索引超出内容大小的条件。此代码示例的输出未显示任何内容。

1 个答案:

答案 0 :(得分:11)

Rust中的范围不包含上限(除非您使用..=范围构造函数)。这意味着2..2之类的范围为零长度:“从2开始,将每个元素增加到但不包括2”。当长度为5时,5..55..是等效的。

尽管从最后一个元素开始的范围似乎没有多大意义,但以这种方式工作很方便。例如,如果您正在缩小范围:

for i in 0 .. s.len() + 1 {
    println!("slice = {:?}", &s[i ..]);
}

输出:

slice = "hello"
slice = "ello"
slice = "llo"
slice = "lo"
slice = "o"
slice = ""

如果不得不分别处理最后一个空片,这会很烦人。

但是,如果超出数据长度 ,则会引起恐慌。没有任何理由在字符串长度为5时故意写s[6..6]