gpt4 book ai didi

rust - 字符串到解析值的向量

转载 作者:行者123 更新时间:2023-11-29 08:21:29 25 4
gpt4 key购买 nike

由于大量的编译器错误和文档浏览,我想到了这个函数。

use std::io;
use std::io::Read;
use std::str::FromStr;
use std::fmt::Debug;

fn parse_vec<T>(a: &String) -> Vec<T>
where T: FromStr, <T as FromStr>::Err: Debug {

a.split_whitespace()
.filter_map(|word| word.parse().ok())
.collect()
}

fn main() {
let mut all_input = String::new();
io::stdin().read_to_string(&mut all_input)
.expect("io::stdin().read_to_string(&mut all_input) error");

let v: Vec<i32> = parse_vec(&all_input);
println!("{}", v[0] + v[1]);
println!("{}", all_input);
}
  1. 什么是<T as FromStr>::Err: Debug意思是?它在那里是因为编译器建议它。我不知道那是什么。
  2. 可以函数parse_vec缩短?
  3. 如果我改变parse_vec取得字符串 fn parse_vec<T>(a: String) -> Vec<T> 的所有权all_input的内存会怎样在 parse_vec 之后释放字符串完成了吗?
  4. 有没有办法在没有读取输入的中间字符串的情况下做到这一点?

最佳答案

  1. <T as FromStr>是不必要的;你可以只使用 T .用来特指T FromStr 的实现特征。在这种情况下,代码并没有模棱两可,不需要那种程度的澄清。

    <T as FromStr>::Err指的是 Err type associated with FromStr -- 如果转换失败,错误类型是什么?

    where <T as FromStr>::Err: Debug需要那个,不管T::Err也就是说,它必须实现 Debug特征。您当前的代码不需要此子句:我删除了它并且很好。在之前的代码迭代中,您可能使用了 unwrap expect 而不是 ok .两者 unwrapexpect要求 Result的错误类型(此处为 <T as FromStr>::Err)实现了 Debug (您可以在文档中看到这一点:这些方法是在 impl block 中定义的 where E: Debug ),因为如果 Result 将在 panic 消息中使用调试表示是一个 Err .

  2. 好吧,你可以去掉 <T as FromStr>::Err: Debug条款。除此之外,我看不出在不改变函数功能的情况下可以删除什么。

  3. 除非您将其退回或存放在其他地方,否则是的。这就是所有权的运作方式。

  4. 没有。

  5. 你几乎应该永远使用&String ; &str适用于更多类型。唯一&String此外,您还可以访问 String::capacity这在阅读时并不是很有用。

关于rust - 字符串到解析值的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40312273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com