Rust 中带有纯宏的函数组合链

2024-04-18

我读了

如何在 Rust 中编写函数? https://stackoverflow.com/questions/45786955/how-to-compose-functions-in-rust

Rust 中的函数组合链 https://stackoverflow.com/questions/72597835/function-composition-chain-in-rust

我了解到在 Rust 中实现函数组合链相当困难,并且人们将宏与某些函数一起使用,但是,我想知道是否可以仅使用宏而不使用宏compose从一开始就发挥作用。

I mean

compose!(f, g)可以简单地改写为|x| g(f(x))(只是另一种语法)

or

compose!(f, g, h)可以类似地重写为|x| h(g(f(x)))

compose!(f, g, h, i)可以类似地重写为|x| i(h(g(f(x))))

compose!(f, g, h, i,...)可以类似地重写为|x| ...(i(h(g(f(x)))))

作为递归方式。

我猜这个递归宏不需要实际的函数组合函数。 我刚刚开始学习 Rust 宏,那么编写此代码的明智方法是什么?

附言。 Rust 中的宏类型推断是否可以正常工作?


是的,您只能使用宏来做到这一点:

macro_rules! compose {
    ($($rest:ident),+) => {
        |x| { compose!(expand x, $($rest),*) }
    };
    (expand $inner:expr, $function:ident, $($rest:ident),*) => {
        compose!(expand $function($inner), $($rest),*)
    };
    (expand $inner:expr, $function:ident) => {
        $function($inner)
    };
}

let a = compose!(f, g, h, i);
//expands into:
let a = |x| i(h(g(f(x))));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 中带有纯宏的函数组合链 的相关文章

  • 允许 Rust 格式中未使用的命名参数!() 系列

    Given format red reset text red RED blue BLUE reset RESET 编译器退出并出现错误 error named argument never used gt example rs 1 47
  • Java 源文件中可以有宏吗

    在我的程序中 我多次从控制台读取整数 每次 我都需要输入这一行 new Scanner System in nextInt 我习惯了 C C 我想知道我是否可以定义类似的东西 define READINT Scanner System in
  • 尝试将盒装 dyn 特征传递到函数时出现“借用的值寿命不够长”错误

    我是 Rust 新手 我对借用检查器的行为感到非常困惑 trait Foo fn foo self struct Bar lt a gt pub f a Vec
  • 如何使用(不安全)别名?

    Rust 有严格的别名规则 但如果 我知道自己在做什么 我可以解决这些问题吗 我试图将一个 C 函数转换为 Rust 该函数通过从输入缓冲区读取并写入目标缓冲区来执行复杂的操作 但它有一个巧妙的优化 允许输入和输出缓冲区相同 foo src
  • 无法在 C++ 中使用宏定义类

    我想生成许多几乎没有什么区别的子类 所以我想使用宏来简化我的工作 宏定义如下 define DECLARE SUB CLASS sub class name base class name value1 class sub class na
  • “流不包含有效的 UTF-8”是什么意思?

    我正在创建一个简单的 HTTP 服务器 我需要读取请求的图像并将其发送到浏览器 我正在使用这段代码 fn read file mut file name String gt String file name file name replac
  • GCC/CLANG 与 MSVC 的预处理器之间有何差异?

    以下预处理器宏 通常的嫌疑人 测试空参数列表并计算参数数量 在 gcc clang 上运行时没有警告 但在 Microsoft VisualC 上失败 IS EMPTY returns nothing if the parameter li
  • for 循环如何借用迭代器?

    一个人怎样才能拥有一个for in循环借用它正在操作的迭代器 例如 let x vec 1 2 3 4 let i x iter for a1 in i break iterate over just one i for a2 in i b
  • Rust 中的基本树和指针

    我拥有一些 C 语言背景 尝试 学习 Rust 让我对自己的能力产生了质疑 我正在尝试找出如何更改拥有的指针 并且正在努力做到这一点 除了从额外的库中复制之外 我无法弄清楚二叉树上所需的递归 特别是 我不知道如何交换指针分支 虽然使用链表我
  • 我可以在 Rust 中有效地按值返回对象吗?

    我想用函数初始化一个大对象 目前我有 fn initialize mydata mut Vec
  • 如何将对堆栈变量的引用传递给线程?

    我正在编写一个 WebSocket 服务器 其中 Web 客户端连接以与多线程计算机 AI 下棋 WebSocket 服务器想要传递一个Logger对象到 AI 代码中 这Logger对象会将日志行从 AI 传送到 Web 客户端 这Log
  • 宏扩展忽略了 MSVC 中的一些标记

    我在 msvc 编译器中遇到宏扩展问题 我希望将以下代码扩展为F x 它在 gcc 和 clang 上执行 但 msvc 将其扩展为F忽略x令牌 这里发生了什么 define S s s define F define M S S F x
  • 什么是构建依赖项?

    构建依赖关系 中解释货物簿 https doc rust lang org cargo reference specifying dependencies html build dependencies 您可以依赖其他基于 Cargo 的板
  • 如何打印带有前导零的二进制整数?

    我正在做一些摆弄 我想打印我的 u16 中的所有位 let flags 0b0000000000101100u16 println flags b flags 这打印flags 0b101100 我如何让它打印flags 0b0000000
  • 是否可以从通用特征实现中排除某种类型?

    我正在尝试用毯子创建一个错误类型From实施任何Error 但是由于这种类型本身就是一个Error我遇到冲突 pub struct ApiError pub i64 pub String impl
  • 无法覆盖 Rustup 工具链以自定义构建 iOS 工具链

    我正在用我的 Rust 版本创建我自己的工具链 我需要它与 iOS 架构进行交叉编译 当尝试设置默认工具链或覆盖当前目录的工具链时 我收到有关工具链名称的错误 以下是我创建这个新工具链所采取的步骤 创建 Rustup 工具链 rustup
  • 当替换器使用变量时,如何调用 Regex::replace_all?

    对于下面的代码 我尝试输出输入单词 后跟随机字符串 第一个函数可以编译 但我不想要它 因为它不使用随机字符串 第二个函数会产生编译器错误 我如何解决它 use regex Regex fn main let cd rust ok but i
  • 无法启动客户端 Rust 语言服务器

    我正在尝试弄清楚如何使用 WSL 中的 rustc 和 Cargo 我使用 VS Code 和 Rust rls 插件 可以编译我的代码 但 RLS 存在问题 无法启动客户端 Rust 语言服务器 Rustup 不可用 安装自https w
  • 有没有办法以数组的形式访问结构体字段?

    我是 Rust 新手 正在尝试弄清楚这是否可行 因此 有时函数 方法以数组形式访问数据会更干净 有时按名称访问数据会更干净 在 Rust 中我可以定义这样的东西 struct Vector3D x f64 y f64 z f64 coord
  • 将相同变量绑定到共享特征的不同类型的模式

    我有一个关于通过特征共享某些行为的值的模式匹配的问题 我有一个带有两个变体的枚举 每个变体都有不同类型的绑定值 其中两种类型都实现一个特征 我试图弄清楚是否可以创建一个单一的模式 E VarA x E VarB x 形式 其中我将两种类型绑

随机推荐

  • 部署到 Docker 时外部化 Spring Boot 属性

    在我的 Spring Boot 应用程序中 我想将属性外部化以在 Docker 容器中运行 首次部署时 当前的属性my server src main resources application yml由应用程序按预期加载和使用 一切正常
  • 如何修复这个已有 8 年历史的 VBA 64 位编译器错误?

    所以这就是错误 64 BitVBA主机 例如Access 365 64位或Excel 2016 64位 创建类模块SomeClass this needs to be here to trigger the bug Private Sub
  • Hashmap 单键保存一个类。计算密钥并检索计数器

    我正在开发一个数据库自我项目 我有一个来自以下位置的输入文件 http ir dcs gla ac uk resources test collections cran http ir dcs gla ac uk resources tes
  • 将数据表保存到文本文件的最短方法

    我刚刚找到了一些答案 但发现它们都非常长并且有很多迭代 所以我想出了自己的解决方案 将表转换为字符串 string myTableAsString String Join Environment NewLine myDataTable Ro
  • JavaScript 中的封装

    很久以前 我看到有人用如下代码封装了整个 JavaScript 块 function this 问题 上面的代码正确吗 像上面提到的那样封装整个 JavaScript 块有什么好处 对 那是正确的 它称为自调用匿名函数表达式 JavaScr
  • SQL Server DateTime 参数“舍入”警告

    与其说是问题 不如说是警告 今天早上我们解决了一个非常令人费解的错误 我们有各种报告 允许用户输入他们想要运行的日期范围 假设是 如果您要求提供 2010 年 8 月 1 日至 2010 年 8 月 10 日的报告 您的意思是include
  • android内容提供者总和查询

    是否可以使用getContentResolver query 当我想要的时候sum column OR 我是否必须对数据库句柄进行原始查询 当提供列数组时ContentResolver query 将列名称括起来sum 功能 String
  • 将python程序转换为windows可执行文件

    我正在尝试从具有 GUI 的 python 程序创建 Windows 可执行文件 我正在使用以下脚本 from distutils core import setup import py2exe setup console gui py 它
  • Typescript 阻止节点/模块工厂模式:错误 TS4060

    当使用 ES6 模块语法导出返回 Typescript 类实例的工厂函数时 会产生以下错误 错误 TS4060 导出函数的返回类型具有或正在使用私有名称 Paths 来自 paths ts Class scoped behind the e
  • Google Map API 通过邮政编码获取地址信息,但它通过街道号码响应结果

    我正在使用谷歌地图 API 通过世界各地的邮政编码获取地址信息 非特定国家 地区 我预计邮政编码是 610 但 google 响应结果是街道号码 610 有什么方法可以仅通过邮政编码获取地址吗 预先感谢各位的支持 与此查询一起进行的操作怎么
  • 如何在 SVG 中制作不同大小的内嵌文本?

    在 HTML 中为不同的单词创建具有不同字体大小的文本非常容易 但是关于
  • for(:) 在 Java 中是什么意思?

    package MyTest import java beans BeanInfo import java beans Introspector import java beans PropertyDescriptor class Pers
  • JTextField设置输入限制

    您好 我正在尝试使用 setDocument 方法来限制用户可以在文本字段中输入的字符数 但不知怎的 它并没有限制输入字符的数量 这是代码 import javax swing text AttributeSet import javax
  • 从加载的信息中计算出值

    我需要能够为用户进行的每个赌注显示 动态回报 但由于某种原因 它们都不起作用 我以前曾问过这个问题 但没有运气 我希望其中的额外细节足以帮助您最终找到答案 我已经对其中一个脚本进行了硬编码 以便使用odds 1 stake 1等等 这有效
  • :hover 仅适用于rotateX 转换后的div 的下部

    我有一个 div 并应用了 CSSrotateX 变换 webkit transform perspective 500px rotateX 60deg rotateY 60deg 一堆较小的 div 漂浮在其中 并应用 hover 规则
  • MATLAB 写入多页 tiff 指数慢

    我正在尝试编写一个多页 tiff 文件 该文件是 128 像素 x 128 像素 x 122000 帧的 16 位无符号整数 ImageJ 或简短的 Python 脚本可以在快速机器上在一分钟内完成此操作 在同一台机器上 无论使用我尝试过的
  • 使用 TIMEZONE 查询 Oracle TIMESTAMP

    我在 Oracle DB 表中有一个类型为TIMESTAMP 6 WITH TIME ZONE 有些数据行包含来自不同时区的数据 有些是 UTC 有些是其他时区偏移量 有没有一种方法可以查询 Oracle 表 以便结果始终以 UTC 形式返
  • C# LINQ to SQL:重构此通用 GetByID 方法

    我写了下面的方法 public T GetByID int id var dbcontext DB var table dbcontext GetTable
  • GCC 为 AVR 上的简单 ISR 生成不必要的寄存器推送

    我有一些简单的 C 程序 如果使用 g 编译 它会生成以下汇编文本 唯一的说法是sbi 这不会影响任何状态标志 我想知道为什么 G 会产生这些无用的推送 弹出r0 and r1 global vector 14 type vector 14
  • Rust 中带有纯宏的函数组合链

    我读了 如何在 Rust 中编写函数 https stackoverflow com questions 45786955 how to compose functions in rust Rust 中的函数组合链 https stacko