gpt4 book ai didi

rust - 如何将 Into 的引用传递给另一个函数?

转载 作者:行者123 更新时间:2023-12-03 11:44:19 26 4
gpt4 key购买 nike

我有一个接受类型 Into<A> 的函数,你怎么调用它,假设我有一个 VecInto<A> ?
这是一些无法编译的示例代码:

struct A {}

struct B {}

impl From<B> for A {
fn from(value: B) -> A {
A {}
}
}

impl From<&B> for A {
fn from(value: &B) -> A {
A {}
}
}

fn do_once<H: Into<A>>(item: H) {
println!("do_once");
}

fn do_many<J: Into<A>>(items: Vec<J>) {
let item = &items[0];
do_once(item);

// In the real code, we iterate here over all items.
}
错误:
error[E0277]: the trait bound `A: From<&J>` is not satisfied
--> src\main.rs:28:5
|
22 | fn do_once<H: Into<A>>(item: H) {
| ------- required by this bound in `do_once`
...
28 | do_once(item);
| ^^^^^^^ the trait `From<&J>` is not implemented for `A`
|
= note: required because of the requirements on the impl of `Into<A>` for `&J`
我认为问题在于我通过了 &Into<A> ,而不是 Into<A> .
除了更改 do_once 以接受 &H 之外,还有其他解决方案吗?而不是 H?在我的真实案例中,我想避免更改该 API。

最佳答案

是的,只需移动 trait bound 所以 &JInto<A>而不是 J :

fn do_many<J>(items: Vec<J>)
where
for<'a> &'a J: Into<A>
{
let item = &items[0];
do_once(item);

// In the real code, we iterate here over all items.
}
Playground link

关于rust - 如何将 Into 的引用传递给另一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64979113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com