【发布时间】:2019-01-14 12:45:13
【问题描述】:
fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 { // definition
f(arg) + f(arg)
}
do_twice(|x| x + 1, 5) // call
这个函数接受闭包和函数指针。它接受一个函数指针作为参数类型。
什么时候我应该更喜欢使用 trait 对象,比如 &dyn Fn(i32) -> i32 或 Box<dyn Fn(i32)-> i32> 而不是 fn
fn do_twice(f: &dyn Fn(i32) -> i32, arg: i32) -> i32 { // definition
f(arg) + f(arg)
}
do_twice(&|x| x + 1, 5) // call
或
fn do_twice(f: Box<dyn Fn(i32) -> i32>, arg: i32) -> i32 { // definition
f(arg) + f(arg)
}
【问题讨论】:
-
感谢您澄清了我的疑问。 fn 类型参数只能接受不捕获环境的闭包所以,当没有这样的约束时应该使用 trait 对象
-
供参考(除了答案之外):RFC 1558 建议自动强制不将其环境捕获到 fn 指针的闭包。感谢这个 RFC,您的示例可以正常工作(可能出乎意料)。
标签: function rust closures traits trait-objects