我的源文件包含给定日期的许多产品的文本 CSV 行。我想使用 Rust 来整理这些文件,以便我最终得到许多新的目标 CSV 文件,每个产品一个,每个包含仅特定于该产品的行的部分。
我当前的解决方案是遍历源文件的行并使用 aHashMap<String, String>
来收集每个产品的行。我拆分每个源代码行并使用包含产品 ID 的元素作为键,Entry
在我的HashMap
. 如果它是空的,我会String
使用一个预先分配给定容量的新值来初始化该值,以便我可以在此后有效地附加到它。
// so far, so good (the first CSV item is the product ID)
let mystringval = productmap.entry(splitsource[0].to_owned()).or_insert(String::with_capacity(SOME_CAPACITY));
然后我想将同一源行的格式化元素附加到这个Entry
. 网上有很多例子,比如
https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#method.entry
如果HashMap
值为整数,如何使这个工作:
// this works if you obtain an Entry from a HashMap containing int vals
*myval += 1;
我还没有想出如何将更多文本附加到Entry
我HashMap<String, String>
使用这种语法获得的文本中,并且我已尽最大努力在线研究示例。在 Rust 数据结构中操作非数字条目的例子非常少。
// using the Entry obtained from my first code snippet above
*mystringval.push_str(sourcePortion.as_str());
尝试编译它会产生以下错误:
error: type `()` cannot be dereferenced
--> coll.rs:102:17
|
102 | *mystringval.push_str(sourcePortion.as_str());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如何附加到值的String
内部Entry
?
*mystringval.push_str(sourcePortion.as_str());
被解析为*(mystringval.push_str(sourcePortion.as_str()));
,因为String::push_str
返回()
,你会得到() cannot be dereferenced
错误。
在取消引用周围使用括号可以解决优先级问题:
(*mystringval).push_str(sourcePortion.as_str());
之所以*myval += 1
有效是因为一元*
的优先级高于+=
,这意味着它被解析为
(*myval) += 1
由于or_insert
return &mut V
,您不需要在调用其方法之前取消引用它。以下也有效:
mystringval.push_str(sourcePortion.as_str());
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句