如何通过函数指针调用方法?

Nul*_*lik 2 methods function-pointers rust

使用函数指针在对象上调用方法的正确语法是什么?

struct Foo {
    var: i32,
}

impl Foo {
    fn method(&mut self, arg: i32) {
        self.var = self.var + arg;
        println!("var = {}", self.var);
    }
}

fn main() {
    let foo = Foo { var: 11 };
    let func_ptr: Fn() = &foo.method;
    (func_ptr).method(12);
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

struct Foo {
    var: i32,
}

impl Foo {
    fn method(&mut self, arg: i32) {
        self.var = self.var + arg;
        println!("var = {}", self.var);
    }
}

fn main() {
    let foo = Foo { var: 11 };
    let func_ptr: Fn() = &foo.method;
    (func_ptr).method(12);
}
Run Code Online (Sandbox Code Playgroud)

我想我没有使用正确的func_ptr类型;什么是正确的类型?

Pet*_*aro 5

方法不绑定self参数,但您可以通过它们的完全限定名称访问方法,如果您愿意,可以将它们保存在函数指针中。稍后,当您调用函数指针时,您必须自己提供self参数:

struct Foo {
    var: i32,
}

impl Foo {
    fn method(&mut self, value: i32) {
        self.var += value;
        println!("var = {}", self.var);
    }
}

fn main() {
    let mut foo = Foo { var: 11 };
    let func_ptr = Foo::method;
    func_ptr(&mut foo, 12);
}
Run Code Online (Sandbox Code Playgroud)

如果你想手动定义这个局部变量的类型,那么它将是以下内容:

let func_ptr: fn(&mut Foo, i32) = Foo::method;
Run Code Online (Sandbox Code Playgroud)

如果你想使用特征符号,你必须在引用后面使用它:

let func_ptr: &Fn(&mut Foo, i32) = &Foo::method;
Run Code Online (Sandbox Code Playgroud)

  • 如果你想绑定 `self` 以便不需要在调用站点指定它,你可以使用闭包: `let mut func_ptr = |arg: i32| { self.method (arg) };` (3认同)