在Rust中返回函数的正确语法是什么?下面的代码不会编译。
fn identity<T>(a: T) -> T { return a; }; fn right<T>(a: T) -> Fn { return identity; };
bzzcjhmw1#
这里(playground)是一个最小的例子:
fn identity<T>(a: T) -> T { return a; } fn right<T>(_a: T) -> impl Fn(T) -> T { return identity; } fn main() { println!("{}", right(0)(42)) }
您需要:
Fn(T) -> T
right
impl
或者,你也可以写函数指针fn(T) -> T作为返回类型,因为这不是一个trait,所以你不需要impl关键字:
fn(T) -> T
fn right<T>(_a: T) -> fn(T) -> T { return identity; }
只有fn项和非捕获闭包可以被强制为函数指针,因此,虽然这更简单,但并不是在所有情况下都有效。
fn
yruzcnhs2#
fn identity<T>(a: T) -> T { return a; } fn right<T>() -> &'static dyn Fn(T)->T { return &identity::<T>; } fn main() { println!("{}", right()(3.1415)); }
playground〈--自己测试一下。
&'static dyn Fn(T)->T意味着它返回一个对满足Fn(T)->T trait的对象的引用(因为yes Fn(T)->T确实是trait,而不是类型)。
&'static dyn Fn(T)->T
Fn(T)->T
7ivaypg93#
在别人给出两个答案后自己给出答案:我想到了这个:
fn identity<T>(a: T) -> T { a }; fn right<T, U>(_a: T) -> fn(U) -> U { identity };
right的返回类型不必与identity的T的输入相同。
identity
T
3条答案
按热度按时间bzzcjhmw1#
这里(playground)是一个最小的例子:
您需要:
Fn(T) -> T
。right
的返回类型impl
元素 * trait *Fn(T) -> T
。或者,你也可以写函数指针
fn(T) -> T
作为返回类型,因为这不是一个trait,所以你不需要impl
关键字:只有
fn
项和非捕获闭包可以被强制为函数指针,因此,虽然这更简单,但并不是在所有情况下都有效。yruzcnhs2#
这是我想到的最好的:
playground〈--自己测试一下。
解释
&'static dyn Fn(T)->T
意味着它返回一个对满足Fn(T)->T
trait的对象的引用(因为yesFn(T)->T
确实是trait,而不是类型)。7ivaypg93#
在别人给出两个答案后自己给出答案:
我想到了这个:
right
的返回类型不必与identity
的T
的输入相同。