Rust &引用;恐慌于';断言失败:开始<;=完";使用地图时
我刚开始接触铁锈Rust &引用;恐慌于';断言失败:开始<;=完";使用地图时,rust,Rust,我刚开始接触铁锈 fn main() { let s = "aaabbb\naaaccc".to_string(); let a: Vec<&str> = s.split('\n').map(|s| s.slice_chars(3, s.len())).collect(); assert_eq!(a, vec!["bbb", "ccc"]); } 这些是回溯 $ RUST_BACKTRACE=1 cargo run Running `tar
fn main() {
let s = "aaabbb\naaaccc".to_string();
let a: Vec<&str> = s.split('\n').map(|s| s.slice_chars(3, s.len())).collect();
assert_eq!(a, vec!["bbb", "ccc"]);
}
这些是回溯
$ RUST_BACKTRACE=1 cargo run
Running `target/hello_world`
thread '<main>' panicked at 'assertion failed: begin <= end', /Users/rustbuild/src/rust-buildbot/slave/nightly-dist-rustc-mac/build/src/libcore/str/mod.rs:1478
stack backtrace:
1: 0x1091266b3 - sys::backtrace::write::hc8e3cee73e646c590nC
2: 0x10912ba0e - panicking::on_panic::h00b47941f5bc8a02HOL
3: 0x109110de8 - rt::unwind::begin_unwind_inner::h539538ef7f909326UvL
4: 0x1091115fe - rt::unwind::begin_unwind_fmt::h7ee8242816be0431quL
5: 0x10912b29e - rust_begin_unwind
6: 0x10914a487 - panicking::panic_fmt::hbdb6961ecc952cf7cSv
7: 0x10914a35a - panicking::panic::h2860b801a6212420fQv
8: 0x10914bfd1 - str::str.StrExt::slice_chars::hb48fc0a9452c1b98PGD
9: 0x109110791 - str::StrExt::slice_chars::h13298185343564271120
10: 0x10910fe14 - main::closure.2239
11: 0x10910fd13 - iter::Map<I, F>::do_map::h17245677587133977247
12: 0x10910e7dd - iter::Map<I, F>.Iterator::next::h11146527951811133470
13: 0x10910dc39 - vec::Vec<T>.FromIterator<T>::from_iter::h11956274897938765189
14: 0x10910d8bf - iter::IteratorExt::collect::h15101737251385262689
15: 0x109106f22 - main::h2fa2dff98d35cbb8faa
16: 0x10912d279 - rust_try_inner
17: 0x10912d266 - rust_try
18: 0x10912c1f2 - rt::lang_start::h660a0b4ce4c9ac40HIL
19: 0x109106f9f - main
你超出了你的底线。下面是一个例子:
fn main() {
let s = "a";
let s2 = s.slice_chars(3, s.len());
}
我真的不知道你为什么要做这个切片,所以很难推荐一个更好的解决方案。我想这是因为
git
的输出没有你所期望的格式:这可能是因为有一行len()
小于3 ins.slice\u chars(3,s.len())
,这对于这个函数是无效的。因此,您需要确保正确理解格式,和/或例如,将调用括在if
中,例如if。。。{s.slice_chars(3,s.len())}else{“}
此外,这里还有一个域不匹配:
slice\u chars
对代码点进行操作,但是s.len()
返回字符串中的字节数。字节和代码点不一定相等(事实上,当字符串为纯ASCII时,它们仅在UTF-8中相等),因此您应该使用char\u len
(到处使用代码点),或者使用s[3..]
(到处使用字节).如果程序的输出包含长度小于3个字符的行(例如,仅包含换行符的行),则代码将失败
您尚未描述要执行的操作,但一种可能的解决方案是筛选出少于3个字符的行:
#![feature(process, collections)]
use std::process::Command;
fn main() {
let output = Command::new("git").args(&["status", "--porcelain"]).output().unwrap_or_else(|e| {
panic!("failed to execute process: {}", e)
});
let s = String::from_utf8_lossy(output.stdout.as_slice()).to_string();
let a: Vec<&str> = s.split('\n')
.filter(|s| s.len() >= 3)
.map(|s| s.slice_chars(3, s.len()))
.collect();
}
#![功能(流程、集合)]
使用std::process::命令;
fn main(){
让output=Command::new(“git”).args(&[“status”,“--ceral”]).output().unwrap_或_else(| e|{
死机!(“无法执行进程:{}”,e)
});
设s=String::from_utf8_lossy(output.stdout.as_slice())to_String();
设a:Vec=s.split('\n')
.filter(|s | s.len()>=3)
.map(| s | s.slice_chars(3,s.len()))
.收集();
}
感谢您让我知道域不匹配的情况!请确保投票选出有用的答案,如果答案解决了您的问题,请将其标记为已接受!如果没有答案是可以接受的,考虑留下解释原因的评论,或者编辑你的问题以不同的方式来表述问题。
fn main() {
let s = "a";
let s2 = s.slice_chars(3, s.len());
}
#![feature(process, collections)]
use std::process::Command;
fn main() {
let output = Command::new("git").args(&["status", "--porcelain"]).output().unwrap_or_else(|e| {
panic!("failed to execute process: {}", e)
});
let s = String::from_utf8_lossy(output.stdout.as_slice()).to_string();
let a: Vec<&str> = s.split('\n')
.filter(|s| s.len() >= 3)
.map(|s| s.slice_chars(3, s.len()))
.collect();
}