gpt4 book ai didi

rust - 将借用项目的方法转换为拥有该项目所有权的方法

转载 作者:行者123 更新时间:2023-12-01 22:47:35 24 4
gpt4 key购买 nike

我想知道 Rust 是否可以自动强制执行一个实现了 Fn(&X) -> Y 的函数进入实现 Fn(X) -> Y 的函数.

更具体地说,我有一个具有以下签名的高阶函数:

fn do_stuff<Y, F: Fn(i32) -> Y>(action: F) {
// Does some stuff with the method (specifically, move it into a Box)
}

我希望能够这样调用它:

do_stuff(i32::to_string)

代替当前

do_stuff(|x| x.to_string())

但是,我收到以下错误:

expected function signature fn(i32) -> _,

found function signature for<'r> fn(&'r i32) -> _.

我认为这是因为函数 i32::to_string&self作为参数,而闭包拥有它的所有权。

有没有办法可以更改 do_stuff 的签名?这样我也可以这样调用它?


Here是 rust playground 中问题的重现。

最佳答案

没有办法将 Fn(&T) -> U 隐式强制转换为 Fn(T) -> U,因为它不在 Rust 会进行的隐式强制转换中允许。但是,有一种方法可以分解出重复的代码:

fn add_ref<T, U>(f: impl Fn(&T) -> U) -> impl Fn(T) -> U {
move |ref x| f(x)
}

它适用于您的示例(的最小化版本):

fn do_stuff<Y, F: Fn(i32) -> Y>(_: F) {}

fn main() {
do_stuff(add_ref(i32::to_string))
// do_stuff(i32::to_string)
// ^^^^^^^^^^^^^^^^^^^^^^^^ this would fail
}

参见 the playground .

关于rust - 将借用项目的方法转换为拥有该项目所有权的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74970575/

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