【问题标题】:String to vector of parsed values字符串到解析值的向量
【发布时间】:2016-10-28 19:48:09
【问题描述】:

由于大量编译器错误和文档浏览,我想出了这个功能。

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. &lt;T as FromStr&gt;::Err: Debug 是什么意思?它在那里是因为编译器建议它。我不知道它是什么。
  2. 函数parse_vec可以缩短吗?
  3. 如果我更改parse_vec 以获取字符串fn parse_vec&lt;T&gt;(a: String) -&gt; Vec&lt;T&gt; 的所有权,all_input 字符串的内存会在parse_vec 完成后释放吗?
  4. 有没有办法在没有用于读取输入的中间字符串的情况下做到这一点?

【问题讨论】:

    标签: rust


    【解决方案1】:
    1. &lt;T as FromStr&gt; 是不必要的;你可以使用T。它用于特指TFromStr 特征的实现。在这种情况下,代码不够含糊,不需要这种程度的澄清。

      &lt;T as FromStr&gt;::Err指的是Err type associated with FromStr——如果转换失败,错误类型是什么?

      where &lt;T as FromStr&gt;::Err: Debug 要求,无论T::Err 是什么,它都必须实现Debug 特征。您当前的代码不需要此子句:我删除了它,它很好。在之前的代码迭代中,您可能使用了unwrapexpect 而不是okunwrapexpect 都要求 Result 的错误类型(此处为 &lt;T as FromStr&gt;::Err)实现 Debug(您可以在文档中看到这一点:方法在 impl 块中定义where E: Debug),因为如果ResultErr,则会在恐慌消息中使用调试表示。

    2. 好吧,你可以去掉&lt;T as FromStr&gt;::Err: Debug 子句。除此之外,如果不更改函数的功能,我看不出您可以删除什么。

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

    4. 没有。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 2017-04-10
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多