如何声明一个接受任何可以转换为HashMap <string,string>的函数的函数

时间:2017-12-11 09:08:56

标签: function hashmap rust

我有一个看起来像这样的结构:

&str

对于人体工程学,我想要一个同时接受StringHashMap的功能。我读到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)

1 个答案:

答案 0 :(得分:5)

您忘记将Item的元组元素作为类型(而不是特征)传递。以下应该有效:

fn set_map<S: Into<String>, T: Into<String>, I: IntoIterator<Item=(S, T)>>(fields: I) {
    ...
}

两个不同的参数ST而不只是一个允许您在元组中使用不同的Into<String>类型。