Можно ли распаковать кортеж в аргументы метода? - PullRequest
0 голосов
/ 24 февраля 2020

Распаковка кортежа в качестве аргументов и вызов функции с этими значениями покрывается Можно ли распаковать кортеж в аргументы функции? , но можно ли сделать тот же трюк с методами?

#![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);
}

Для обоих я получаю следующую ошибку:

error[E0615]: attempted to take value of method `method` on type `Foo`
  --> src/main.rs:20:9
   |
20 |     foo.method.call(tuple);
   |         ^^^^^^ help: use parentheses to call the method: `method(...)`

Я не контролирую вызываемый метод, поэтому изменение подписи для принятия кортежей не вариант.

1 Ответ

4 голосов
/ 24 февраля 2020

Методы - это функции, которые

  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);
}

См. Также:

...