【问题标题】:How can I invoke an unknown Rust function with some arguments using reflection?如何使用反射调用带有一些参数的未知 Rust 函数?
【发布时间】:2013-12-07 20:02:51
【问题描述】:

长期以来,我一直是一名 C# 程序员,我玩 Rust 玩得很开心,但我有一个关于反射的问题。也许在这种情况下我不需要反思,但鉴于 Rust 是强类型的,我怀疑我确实需要它(我肯定会在好的 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
}

我该怎么做?我猜我需要传入某种MethodInfo 作为函数的第二个参数,然后用它来获取名称是哈希映射中键的参数并分配值,但我看看围绕反射 API 并找到以下 Pre-Rust 1.0 文档:

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

【问题讨论】:

  • Rust 没有完善的反射能力。它们被认为在很大程度上不应该被使用,因此无论我们最终是否拥有这样的功能,这肯定不是优先事项。目前你想做的事情是做不到的,我认为1.0也不会有这个是公平的。
  • 谢谢@ChrisMorgan - 我会停止寻找它,并考虑是否可以以稍微不同的方式实现我的目标。
  • (我发现通常可以使用特征和特征对象来实现类似于人们使用反射的目标,尽管这肯定不是普遍正确的。)
  • 使用反射通常是一件坏事,即使在 C# 或 Java 这样的语言中也是如此。通常,使用反射来表达超出(静态)类型系统能力的事物,这就是为什么它在动态语言中最流行的原因。 Rust 的类型系统比 C# 或 Java 的要丰富得多(主要是由于结构与特征的解耦),更不用说统一的语言了,而且,根据我的经验,反射不会实现任何有用的东西,而使用较少的重量则无法完成 -手特征。
  • @EduardoLeón:反射是一个用于生成接口的有用工具,例如序列化器、反序列化器、外部代码接口、Web 服务、插件。也可以说“分配内存通常是一件坏事”,这是真的,除了它非常有用。

标签: reflection rust


【解决方案1】:

特征是实现相当数量的反射在其他地方(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);
}

【讨论】:

    猜你喜欢
    • 2022-08-09
    • 1970-01-01
    • 2013-04-03
    • 2011-08-12
    • 1970-01-01
    • 2014-12-06
    • 2012-06-16
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多