Reflection 如何使用反射调用带有一些参数的未知Rust函数?

Reflection 如何使用反射调用带有一些参数的未知Rust函数?,reflection,rust,Reflection,Rust,我做了很长一段时间的C#程序员,在Rust周围玩得很开心,但我有一个关于反思的问题。也许在这种情况下我不需要反射,但考虑到锈迹是强类型的,我怀疑我需要反射(我肯定需要它在好的ol'C#中,保佑它的棉袜) 我有这样的情况: use std::collections::HashMap; fn invoke_an_unknown_function( hashmap: HashMap<String, String>, // Something to denote a fun

我做了很长一段时间的C#程序员,在Rust周围玩得很开心,但我有一个关于反思的问题。也许在这种情况下我不需要反射,但考虑到锈迹是强类型的,我怀疑我需要反射(我肯定需要它在好的ol'C#中,保佑它的棉袜)

我有这样的情况:

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
}
使用std::collections::HashMap;
fn调用一个未知函数(
hashmap:hashmap,
//这里有一些表示我一无所知的函数的东西
) {
//为哈希映射中的每个键分配值
//指向名称为键的参数参数
//然后调用函数
}
我该怎么做?我猜我需要将某种
MethodInfo
作为第二个参数传递给函数,然后使用该参数获取名称为哈希映射中键的参数并分配值,但我查看了反射API,发现了以下pre-Rust 1.0文档:


这些都不足以让我开始。我将如何实现上面描述的功能?

特性是实现反射(ab)在其他地方使用的相当多功能的预期方式

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

Rust没有良好的反射能力。它们被认为是基本上不应该被使用的东西,所以不管我们最终是否有这样的功能,它肯定不是优先考虑的。目前,您正在尝试做的事情无法完成,我认为公平地说,1.0也不会拥有它。谢谢@ChrisMorgan-我将停止寻找它,然后思考是否可以以稍微不同的方式实现我的目标。(我发现traits和trait对象通常可以用来实现与人们使用反射类似的目标,尽管这肯定不是普遍正确的。)使用反射通常是一件坏事,即使在C#或Java之类的语言中也是如此。通常,人们使用反射来表达超出(静态)能力的东西类型系统,这就是为什么它在动态语言中最流行的原因。Rust的类型系统比C#或Java的类型系统丰富得多(主要是由于结构与特性的分离),更不用说单位类型语言了,而且,根据我的经验,反射无法实现任何使用不太繁重的功能无法实现的有用功能。@EduardoLeón:反射是生成接口的有用工具,例如序列化器、反序列化器、外文代码接口、web服务、插件。可以这样说“分配内存通常是件坏事”,这是真的,只是它非常有用。