有没有办法编写一个只使用标准库中的特征接受引用,移动或转换的函数?

时间:2017-11-10 15:09:39

标签: rust

我可以编写一个接受X&X的函数:

fn foo<T: Borrow<X>>(x: T)

我可以编写一个接受XY&Y的函数,假设在Into上实现了Borrow<Y>特征:

fn foo<T: Into<X>>(x: T)

有没有办法编写一个仅使用标准特征接受X&XY&Y的函数?我可以使用自定义特征来做到这一点,但使用标准特性会更好。

我试过了:

use std::borrow::Borrow;

fn foo<TT: Into<T>, T: Borrow<X>>(x: TT) {}

struct X;

fn main() {
    foo(X);
}

但我明白了:

error[E0283]: type annotations required: cannot resolve `_: std::borrow::Borrow<X>`
 --> src/main.rs:8:5
  |
8 |     foo(X);
  |     ^^^
  |
  = note: required by `foo`

1 个答案:

答案 0 :(得分:4)

这是不允许的,因为可能有多条路径。例如,传入的类型可能会实现Into<A> Into<B>。如果AB同时实施Borrow<X>,那么哪种转换适当就不明确。

正如错误消息所述,您可以使用类型注释(a.k.a. turbofish )告诉编译器您希望转换为哪种中间类型:

foo::<_, X>(X);