是否可以将元组解压到方法参数中?

Hol*_*bor 1 methods tuples rust

将元组解包为参数并使用这些值调用函数包含在是否可以将元组解包为函数参数?,但是是否可以对方法执行相同的操作?

#![feature(fn_traits)]

struct Foo;

impl Foo {
    fn method(&self, a: i32, b: i32) {
        println!("{:?}, {:?}", a, b);
    }
}

fn main() {
    let foo = Foo;
    let tuple = (10, 42);

    // does not compile
    //foo.method.call(tuple);

    // nor this one
    //std::ops::Fn::call(&foo.method, tuple);
}
Run Code Online (Sandbox Code Playgroud)

对于两者我都收到以下错误:

#![feature(fn_traits)]

struct Foo;

impl Foo {
    fn method(&self, a: i32, b: i32) {
        println!("{:?}, {:?}", a, b);
    }
}

fn main() {
    let foo = Foo;
    let tuple = (10, 42);

    // does not compile
    //foo.method.call(tuple);

    // nor this one
    //std::ops::Fn::call(&foo.method, tuple);
}
Run Code Online (Sandbox Code Playgroud)

我不控制我调用的方法,因此更改签名以接受元组不是一个选项。

She*_*ter 6

方法是函数

  1. 与类型关联(称为关联函数)。大多数人都熟悉“构造函数”相关函数,例如new. 这些被引用为Type::function_name.
  2. 以某种Self作为第一个参数。

因此,您需要使用Foo::method并提供匹配self

#![feature(fn_traits)]

struct Foo;

impl Foo {
    fn method(&self, a: i32, b: i32) {
        println!("{:?}, {:?}", a, b);
    }
}

fn main() {
    let foo = Foo;
    let tuple = (&foo, 10, 42);
    std::ops::Fn::call(&Foo::method, tuple);
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • @Hollay-HorváthZsombor 它被正确地称为[*完全限定语法*](https://doc.rust-lang.org/book/ch19-03-advanced-traits.html#complete-qualified-syntax-for-disambiguation-calling -methods-with-the-same-name),是的,方法参数中的“self”是[只是语法糖](/sf/ask/1782405481/)。 (2认同)