UFCS:解析T ::方法

时间:2014-11-01 10:06:22

标签: rust

上下文:我试图通过另一个函数对函数进行参数化,并使其静态解析。乍一看,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并跳跃进行一些魔术推理来完成这项工作),但很难让它变得正确。任何关于(/指向)解决机制的帮助都会非常感激..

谢谢!

2 个答案:

答案 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

......嗯,在这个特殊情况下可能不太好。这可能与特质类型推断有关,但我不能说是什么。