我有一个看起来像这样的结构:
&str
对于人体工程学,我想要一个同时接受String
和HashMap
的功能。我读到FromIterator<(K, V)>
有一个特征String
,所以在抽象层面我可以从任何工作,它产生一对变换成字符串的迭代器。
类似地,如果我想要一个接受任何可以转换为T: Into<String>
的函数的函数,我可以使用绑定的fn set_map<I: IntoIterator<Item=(Into<String>, Into<String>)>>(fields: I) {
// ...
}
。
可以对可以转换为字符串的对的迭代器进行相同的操作吗?从概念上讲:
error[E0277]: the trait bound `std::convert::Into<std::string::String> + 'static: std::marker::Sized` is not satisfied
--> src/main.rs:1:1
|
1 | / fn set_map<I: IntoIterator<Item = (Into<String>, Into<String>)>>(fields: I) {
2 | | // ...
3 | | }
| |_^ `std::convert::Into<std::string::String> + 'static` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `std::convert::Into<std::string::String> + 'static`
= note: only the last element of a tuple may have a dynamically sized type
error[E0038]: the trait `std::convert::Into` cannot be made into an object
--> src/main.rs:1:1
|
1 | fn set_map<I: IntoIterator<Item = (Into<String>, Into<String>)>>(fields: I) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::Into` cannot be made into an object
|
= note: the trait cannot require that `Self : Sized`
此错误
for k, val in sorted(datasource_columns.iteritems(), key=lambda(
k, v): sort_order.index(k)):
# columns.add_column(key, sorted(val))
columns.add_column(k, val)
答案 0 :(得分:5)
您忘记将Item
的元组元素作为类型(而不是特征)传递。以下应该有效:
fn set_map<S: Into<String>, T: Into<String>, I: IntoIterator<Item=(S, T)>>(fields: I) {
...
}
两个不同的参数S
和T
而不只是一个允许您在元组中使用不同的Into<String>
类型。