Как я могу вызвать неизвестную функцию Rust с некоторыми аргументами, используя отражение?

Мне очень нравится играть с Рустом, долгое время работавшим на С#, но у меня есть вопрос по поводу рефлексии. Возможно, мне не нужно отражать в этом случае, но, учитывая, что Rust строго типизирован, я подозреваю, что мне это нужно (я определенно нуждаюсь в этом в хорошем старом С#, благослови его хлопковые носки).

У меня такая ситуация:

use std::collections::HashMap;

fn invoke_an_unknown_function(
    hashmap: HashMap<String, String>,
    // Something to denote a function I know nothing about goes here
) {
    // For each key in the hash map, assign the value
    // to the parameter argument whose name is the key
    // and then invoke the function
}

Как бы я это сделал? Я предполагаю, что мне нужно передать какое-то MethodInfo в качестве второго аргумента функции, а затем поэкспериментировать с этим, чтобы получить аргументы, имя которых является ключом в хэш-карте, и присвоить значения, но я искал API отражения и нашел следующую документацию до Rust 1.0:

Ничто из этого не дает мне достаточно, чтобы начать. Как реализовать функцию, описанную выше?

Ответ 1

Черты - это ожидаемый способ реализовать изрядное количество того, для чего (а) отражение используется в другом месте.

trait SomeInterface {
    fn exposed1(&self, a: &str) -> bool;
    fn exposed2(&self, b: i32) -> i32;
}

struct Implementation1 {
    value: i32,
    has_foo: bool,
}

impl SomeInterface for Implementation1 {
    fn exposed1(&self, _a: &str) -> bool {
        self.has_foo
    }

    fn exposed2(&self, b: i32) -> i32 {
        self.value * b
    }
}

fn test_interface(obj: &dyn SomeInterface) {
    println!("{}", obj.exposed2(3));
}

fn main() {
    let impl1 = Implementation1 {
        value: 1,
        has_foo: false,
    };
    test_interface(&impl1);
}