Как я могу вызвать неизвестную функцию 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);
}