如何从特定模块创建所有装饰函数的向量?

2023-12-23

我有一个文件main.rs和一个文件rule.rs。我想定义函数rule.rs将被纳入Rules::rule矢量,而不必将它们一一推动。我更喜欢一个循环来推动它们。

main.rs:

struct Rules {
    rule: Vec<fn(arg: &Arg) -> bool>,
}

impl Rules {
    fn validate_incomplete(self, arg: &Arg) -> bool {
        // iterate through all constraints and evaluate, if false return and stop
        for constraint in self.incomplete_rule_constraints.iter() {
            if !constraint(&arg) {
                return false;
            }
        }
        true
    }
}

rule.rs:

pub fn test_constraint1(arg: &Arg) -> bool {
    arg.last_element().total() < 29500
}

pub fn test_constraint2(arg: &Arg) -> bool {
    arg.last_element().total() < 35000
}

Rules::rule应该填充test_constraint1 and test_constraint2.

在Python中,我可以添加一个装饰器@rule_decorator高于您想要包含在的约束Vec,但我在 Rust 中没有看到类似的东西。

在Python中,我可以使用dir(module)查看所有可用的方法/属性。

Python 变体:

class Rules:

    def __init__(self, name: str):
        self.name = name
        self.rule = []

        for member in dir(self):
            method = getattr(self, member)
            if "rule_decorator" in dir(method):
                self.rule.append(method)

    def validate_incomplete(self, arg: Arg):
        for constraint in self.incomplete_rule_constraints:
            if not constraint(arg):
                return False
        return True

使用rule.py文件:

@rule_decorator
def test_constraint1(arg: Arg):
    return arg.last_element().total() < 29500

@rule_decorator
def test_constraint1(arg: Arg):
    return arg.last_element().total() < 35000

所有功能都带有rule_decorator被添加到self.rule列出并由validate_incomplete功能。


通过一些调整和限制,您可以实现您的目标。您需要使用库存箱 https://crates.io/crates/inventory。这是仅限 Linux、macOS 和 Windows眼下。

然后你可以使用inventory::submit向全局注册表添加值,inventory::collect建立注册表,以及inventory::iter迭代注册表。

由于语言限制,您无法为不属于您的类型的值创建注册表,其中包括原始函数指针。我们需要创建一个newtype called Predicate使用板条箱:

use inventory; // 0.1.3

struct Predicate(fn(&u32) -> bool);
inventory::collect!(Predicate);

struct Rules;

impl Rules {
    fn validate_incomplete(&self, arg: &u32) -> bool {
        inventory::iter::<Predicate>
            .into_iter()
            .all(|Predicate(constraint)| constraint(arg))
    }
}

mod rules {
    use super::Predicate;

    pub fn test_constraint1(arg: &u32) -> bool {
        *arg < 29500
    }
    inventory::submit!(Predicate(test_constraint1));

    pub fn test_constraint2(arg: &u32) -> bool {
        *arg < 35000
    }
    inventory::submit!(Predicate(test_constraint2));
}

fn main() {
    if Rules.validate_incomplete(&42) {
        println!("valid");
    } else {
        println!("invalid");
    }
}

为了实现最初设定的目标,您还需要采取一些步骤:

  • “一个向量”

    You can collect从提供的迭代器构建一个Vec.

  • “装饰函数”

    您可以编写自己的程序宏来调用inventory::submit!(Predicate(my_function_name));为你。

  • “来自特定模块”

    你可以加模块名称 https://doc.rust-lang.org/std/macro.module_path.html进入Predicate稍后对其进行结构和过滤。

也可以看看:

  • 如何在编译时静态注册结构? https://stackoverflow.com/q/32678845/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从特定模块创建所有装饰函数的向量? 的相关文章

随机推荐

  • Rails:Net::SMTPAuthenticationError(535 身份验证失败:用户名/密码错误)

    我正在尝试在 Rails 应用程序中设置电子邮件 但收到错误 Net SMTPAuthenticationError 535 身份验证失败 用户名 密码错误 当我在生产环境中触发邮件操作时 控制器 class FeedbacksContro
  • Windows(手机)8.1 相机使用

    我正在创建一个 Windows 通用应用程序 我希望用户能够上传图片 并且用户应该可以选择当场拍摄并发送该图片 我使用 MediaCapture api 进行此工作 然而 我似乎只能使用一个摄像头 因此 例如 如果我的手机有前置摄像头和后置
  • 在文本框中的最后一个字符后设置焦点

    我有 3 个电话号码文本框 当用户键入时 它会自动从一个文本框移动到下一个文本框 当用户按退格键时 我可以将焦点移动到上一个文本框 问题是在 IE 中 焦点设置在文本框的开头 这是我的代码 在 Chrome 中运行良好 AreaCode l
  • 使用 Response.TransmitFile 下载文件但也包含页面源

    下面是有问题的代码 我下载了一个 csv 但是它将页面源附加到底部 关于如何防止这种情况有什么想法吗 var priceList Test const string downloadName PriceList csv var fs new
  • 使文件夹不受 SVN 管理

    是否可以从存储库中删除该文件夹 就像不会从每个用户的本地存储库中删除该文件夹一样 就我而言 有一个名为 config 的目录 旨在进行版本控制 现在我们决定从版本控制中删除该目录 但将其保留在每台计算机上 顺便将其添加到 svn ignor
  • 页面加载完成后图像消失

    我使用以下代码在页脚中显示图像 我看到图像几秒钟 但是页面完全加载后 图像消失了 有人知道这里出了什么问题吗 我正在使用 Rails 3 2 8 和 Chrome 在 Firefox 或 Safari 中不会发生这种情况 Thanks UP
  • 如何编写使用内置相机拍照的 Solo/Robotium 测试用例?

    从我的活动中 我执行 startActivityForResult MediaStore ACTION IMAGE CAPTURE 然后我进入内置相机活动 在本例中是在模拟器中 当我现在这样做时 独奏 clickOnButton 0 在我的
  • 单调的堆栈和队列。定义和例子

    到底什么是单调堆栈 例如 它与单调队列有何不同 例如 考虑以下整数数组 0 2 1 3 4 如果我从左到右处理这个数组并将其插入到单调递减的堆栈中 我应该在堆栈中看到什么 为什么 Here http www leetcode solutio
  • Nginx 具有不同根的多个位置

    我的 nginx 配置非常简单 里面有 3 个位置 他们每个人都有自己的根目录 我将来应该能够轻松添加另一个根目录 我想要的是 Request admin gt 位置 admin Request admin gt 位置 admin Requ
  • 无法将不可变值作为 inout 参数传递:函数调用返回不可变值

    我分叉了这个项目 所以我不太熟悉所有细节 https github com nebs hello bluetooth blob master HelloBluetooth NSData 2BInt8 swift https github c
  • 如何使数据类更好地与 __slots__ 配合使用?

    It 已决定 https github com ericvsmith dataclasses issues 28删除对的直接支持 slots 来自 Python 3 7 的数据类 尽管如此 slots 仍然可以与数据类一起使用 from d
  • 将 TextField 绑定到 ReadOnlyDoubleProperty

    我可以绑定一个TextField的文本属性为DoubleProperty 像这样 textField textProperty bindBidirectional someDoubleProperty new NumberStringCon
  • 将数据插入 SQL Server 返回错误代码 00q

    首先 我的代码的最大部分是在几周前工作的 与此同时 我们从 MySQL 服务器更换为 SQL 服务器 并且对架构设计进行了一些更改 我使用 Percobol 据我所知 它使用 OpenCobol 编译器 PERFORM 2010 GEBRU
  • Dynamic_cast<> 是否仅限于沿着继承层次结构进行直接转换?

    CODE struct A virtual details there but left out struct B virtual details there but left out struct C A B virtual detail
  • WaitHandle.WaitAll 64 个句柄限制的解决方法?

    我的应用程序通过以下方式生成不同的小工作线程负载ThreadPool QueueUserWorkItem我通过多个跟踪ManualResetEvent实例 我用WaitHandle WaitAll方法阻止我的应用程序关闭 直到这些线程完成
  • 如何向 RCpp 中的数据框添加新列?

    我正在尝试使用 RCpp 向数据框添加新列 在下面的代码中 我打算向数据框 df 添加一个 结果 列 但运行代码后数据集没有 结果 列 你能告诉我他们出了什么问题吗 R 文件调用 AddNewCol 函数 library Rcpp sour
  • 如何在 Perl 中将数组转换为散列?

    我有一个数组 并尝试将数组内容转换为带有键和值的哈希值 索引 0 是键 索引 1 是值 索引 2 是键 索引 3 是值 依此类推 但它没有产生预期的结果 代码如下 open FILE message xml die Cannot open
  • 初始拒绝后使用 getUserMedia() 重新提示权限

    在被拒绝一次后 我们如何使用 getUserMedia 请求相机 麦克风访问权限 我正在使用 getUserMedia 来访问用户的相机并将数据通过管道传输到画布 那一点一切都很好 在测试中 我点击了一次拒绝 此时 在 Chrome 和 F
  • 如何伪造Time.now?

    最好的设置方法是什么Time now为了在单元测试中测试时间敏感的方法 我真的很喜欢Timecop https github com travisjeffery timecop图书馆 您可以以块形式进行时间扭曲 就像时间扭曲一样 Timec
  • 如何从特定模块创建所有装饰函数的向量?

    我有一个文件main rs和一个文件rule rs 我想定义函数rule rs将被纳入Rules rule矢量 而不必将它们一一推动 我更喜欢一个循环来推动它们 main rs struct Rules rule Vec