上下文:我试图通过另一个函数对函数进行参数化,并使其静态解析。乍一看,Fn
特质似乎符合我的需要。
我期望成为"包装"看起来很好(到现在为止),但是我只是指出了我想要传递的方法:
fn binop<T,Op:Fn<(T,T),T>>(op: Op, a:T, b:T) -> T {
// [...]
op.call((a,b))
}
fn addx(a: f64, b: f64) -> f64 {
binop(f64::add, a, b)
// ^~~~~~~~ error: unresolved name `f64::add`.
}
fn main() {
addx(1.0, 2.0);
}
我一直在寻找UFCS RFC中的提示,以及&#34;随机&#34;尝试了一系列指定变体(最多引用std::ops::Add::add
并跳跃进行一些魔术推理来完成这项工作),但很难让它变得正确。任何关于(/指向)解决机制的帮助都会非常感激..
谢谢!
答案 0 :(得分:1)
Fn*
特征是未装箱的闭包特征,而未装箱的闭包现在正在积极开发中。一些便利,例如从功能到实例的自动转换还不起作用,但我相信当未装箱的闭包将取代目前的盒装闭包时,这样的东西将在未来发挥作用。
然而,还有另一个问题。 UFCS is not implemented,我认为它们不会在1.0中实现,因此您现在无法一般性地指定特征方法。您必须使用显式闭包构造,例如:
#![feature(unboxed_closures, unboxed_closure_sugar, overloaded_calls)]
fn binop<T, Op: Fn(T, T) -> T>(op: Op, a: T, b: T) -> T {
// [...]
op(a, b)
}
fn addx(a: f64, b: f64) -> f64 {
binop(|&: a: f64, b: f64| a + b, a, b)
}
fn main() {
println!("{}", addx(1.0, 2.0));
}
(试试here)
答案 1 :(得分:1)
Fn
是新的无框关闭内容。还有简单的函数类型fn(…) -> …
。这种事情(请记住add
通过引用而不是通过值来获取其参数:
fn binop<T>(op: fn(&T, &T) -> T, a: &T, b: &T) -> T {
// [...]
op(a, b)
}
fn addx(a: f64, b: f64) -> f64 {
binop(Add::add, &a, &b)
}
fn main() {
addx(1.0, 2.0);
}
通过rustc运行这个,你得到了这个:
error: internal compiler error: unexpected failure
note: the compiler hit an unexpected failure path. this is a bug.
note: we would appreciate a bug report: http://doc.rust-lang.org/complement-bugreport.html
note: run with `RUST_BACKTRACE=1` for a backtrace
task 'rustc' failed at 'assertion failed: `(left == right) && (right == left)` (left: `3`, right: `0`)', /home/chris/rust/src/librustc/middle/trans/callee.rs:528
......嗯,在这个特殊情况下可能不太好。这可能与特质类型推断有关,但我不能说是什么。