首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【译】设计优雅 Rust 库 API

如果阅读有问题的话请访问:https://www.aloxaf.com/2019/11/elegant_apis_in_rust/ 设计优雅 Rust 库 API 选择一门编程语言时,是否拥有简洁易用库也是一个重要考量因素...更多方法名称约定 除了 RFC 199 和 RFC 344 (见上)规定以外,还有一些其他关于如何选择方法名称约定,目前还没有 RFC 中提及。...TryFrom:尝试通过转换来构造自身 TryInto:尝试消耗自身转换,可能会比较昂贵。 你可能也会喜欢这篇关于如何在 Rust 中进行方便地道转换文章....幸运是,Rust “孤儿规则(orphan rules)” 赋予了为任何类型实现任何 trait 能力——前提是类型和 trait 任意一个是在当前 crate 定义。.../u/ssokolow /r/rust 这个帖子 给出: Hyper 使用这个方法来在编译时保证,你不可能做出诸如 “在请求/响应主体已经开始后又来设置 HTTP 头” 这种经常在 PHP

1.6K30
您找到你想要的搜索结果了吗?
是的
没有找到

源码阅读 | 第一期 : 名称解析

Rust 名称解析 经过查阅名称解析相关资料,了解到 Rust 编译器 2016 年引入 RFC 1560 来改进名称解析处理过程。...第二阶段是从整个映射中根据一个名称来查找定义。这样做目的是解耦。 当前 RFC 1560 已经被实现,宏扩展期间不会做 全名解析,只解析导入和宏。...当整个 AST 被构建以后,才会做全名解析,以便解析整个 crate 中所有的名称。 来看一个示例: #!...其中 x 即是类型命名,也是一个变量命名。Rust 如何进行名称解析来让两个同名标识符共存呢? 因为 Rust 有不同命名空间。...看得出来, lib.rs 定义基本都是 上面文档展示那些 用于名称解析过程中使用结构体或枚举类型。

1.6K30

RUST公开 FFI

在这篇文章,我将讲述我对 Rust 和 FFI 经验,基于 battery-ffi ,它将 FFI 暴露给我一个 crate — battery。...简而言之,它允许其他编程语言,以预期名称我们例子是 battery_get_percentage)在编译后查找已声明函数,而不是编译器生成名称, 就像 _ZN7battery_get_percentage17h5179a29d7b114f74E...返回参数 例子,我想向外部公开一些 Rust 结构,但是由于实现原因,它们可能包含一些复杂结构,而强迫最终用户处理这些东西是一个坏主意。...如果 &* 对你来说看起来有点奇怪的话,这里有一个长版本(这个版本不会编译通过5,但更容易理解发生了什么): let manager_struct: Manager = *ptr; let manager...因此我们需要创建多个 “getter” 函数,从之前创建 *const Battery 指针获取数据(没有关于例子,但是这个结构体与上面代码片段一个结构体非常类似)。

1.8K30

听GPT 讲Rust源代码--compiler(31)

Rust编译器中使用这个数据来处理本地化和国际化问题,例如日期和时间格式化、货币和数字格式化等。通过查找地区父地区代码,可以更容易地确定应该使用哪种本地化和国际化规则。...这些错误类型Rust编译器起到了非常重要作用,用于处理与元数据相关一系列问题,以提供更可靠和健壮编译过程。...这些字段用于描述一个符号位置和具体信息。 DefPathHash:这个enum定义了存储哈希表类型,用于将符号名称映射到定义路径。...Rust编译器,这个文件作用是为了方便编译器元数据文件查找符号定义位置,从而正确地解析和分析代码。...元数据是关于Rust编译后程序信息,可以用于支持动态链接、代码优化等功能。 该文件定义了一系列结构体和枚举类型,用于编码元数据。

6810

听GPT 讲Rust源代码--compiler(36)

通过Rust源代码中使用"sigpipe.rs"文件,可以灵活地处理SIGPIPE信号,并根据需要进行配置和自定义处理。这对于Rust编写需要处理管道错误程序非常有用。...ExternLocation: 表示外部声明位置。 PrintKind: 一个枚举,表示打印类型方式。 TraitSolver: 表示解析trait相关问题求解器。...具体来说,rustc_expand是 Rust 编译器一个 crate,负责实现代码扩展相关功能。它为编译器前端和后端提供了一些功能和数据结构,例如宏展开、属性处理、模式解析等。...Rust编译器扩展过程模块路径解析和模块管理等相关功能。...总之,module.rs文件是负责处理Rust编译器扩展过程模块路径解析和模块管理部分,提供了相关结构体和枚举类型来支持这些功能。

8210

2018年伊始,系统编程语言Rust为何令程序员感到兴奋?

匹配人机工程学特征已经Rust上试运行。 令人高兴Rust社区继续把时间花在这样的人机工程学问题上。...RustCrate生态系统非常棒 程序解析了ELF二进制文件。事实证明,有一个Crate可以做到这一点:elf crate! 现在正在使用elf crate。...当发现一个从未听说过奇怪事情需要使用时(程序头文件vaddr字段),它就在那里!它被称为vaddr,这与C语言结构调用是一样。...Rust,可以控制程序一个方面—确切地知道系统调用它做什么,它分配内存,它休眠了多少微秒—一切。C语言中可以做任何事情,都可以Rust做。...Rust就像我超级英雄语言!如果想做一些奇怪系统魔法东西,用Rust是可能。也许不容易,但可能! bindgen和宏是惊人 已经写过关于bindgen和宏博客文章,但想再谈谈它们!

4.5K100

听GPT 讲Rust Cargo源代码(7)

它负责获取、解析和存储软件包索引数据。 Summaries:这个结构体表示了一个摘要信息,包括名称、版本、依赖关系等。它用于Cargo解析过程存储和处理软件包信息。...在下载过程,它会首先检查本地是否已经存在该 Crate通过 source_id 和 checksum 进行匹配),若已存在则直接返回,否则会向 Registry 发送 HTTP 请求,获取 Crate...这个文件 Rust Cargo 扮演着重要角色,确保了 Rust Crate 有效下载和安装。...这个枚举类型用于 Cargo Git 源快速解析和指定一个特定 Git 提交。...函数内部首先通过调用其他模块函数,解析命令行参数,获取卸载目标软件包信息。 接下来,函数调用Rust包管理器解析器模块进行包解析,找到要卸载软件包及其依赖项。

5410

Rust日报】2023-06-06 motus 一个非常方便命令行密码生成工具

有多种工具用于处理这个标记列表,从 proc_macro crate 提供类型开始,到复杂 crate(例如 syn)结束,这些 crate 允许您解析这些标记输入。...与常规宏不同,过程宏通过外部函数调用而不是直接在编译器调用和扩展。它们被编译为单独二进制文件,编译器将调用该文件。过程宏输入被序列化为标记流,通过动态过程调用发送到宏。...它们 proc_macro crate 定义,我们需要重新实现这个 crate 以支持过程宏。 要在我们编译器实现这些宏,需要我们广泛研究官方实现。...由于我必须花费大量时间查看 rustc 内部结构以及使用适当 -Z 命令调用编译器时产生奇怪输出,所以我想分享一些有趣经历。‍...Quickwit是一个分布式搜索引擎,可用于搜索日志、对话、网页等数据。它旨在以超级高效方式处理PB级数据。当然,所有的代码都是使用Rust 编写

11730

听GPT 讲Rust源代码--srctools(15)

宏展开是Rust语言中重要特性,通过宏展开可以在编译期间生成更多代码。然而,这也可能导致标识符冲突问题,即在宏展开过程,生成代码标识符可能与原始代码标识符重复,引起命名冲突。...通过这些结构体和相关函数,hygiene.rs文件提供了一套完整卫生处理功能,用于处理宏展开过程标识符冲突问题,确保生成代码具有正确命名约定和语义。...通过该文件结构体和枚举类型,可以解析和处理Rust源代码属性,提取出属性名称、值和位置等信息,为后续处理提供基础。...Rust语法扩展是通过宏来实现,宏可以使用syntax::ast::MacCall结构表示。扩展过程可能会出现一些问题,例如解析出现错误或者无法正确处理某些语法结构。...总体来说,fixup.rs文件作用是提供语法修复功能,通过修复语法扩展过程可能发生问题来确保扩展正确性和可靠性。

15110

听GPT 讲Rust Cargo源代码(8)

解析过程解析器会逐步更新解析栈,直到解析完成。 总而言之,文件parse.rs通过解析树形依赖格式文件,将其转换为一个Tree实例,以供后续操作使用。...包含了修复前后文件路径,修复前后文本内容,以及修复前后源码位置信息等。通过FixedCrate结构体,可以将不同crate修复信息存储一个FixedFile。...然后,它使用这些凭据构建一个HTTP请求,向注册表发送登录请求。 登录过程,login.rs也会处理一些错误情况,例如无效凭据、网络连接问题等。它会返回一个结果,表示登录操作成功与否。... Rust Cargo ,Registry 是一个用于存储和管理 Crate中央仓库。用户可以使用 Cargo 命令行工具从 Registry 搜索、下载和发布 Crate 包。...它首先根据配置创建一个RegistryConfig对象,然后使用这个对象和其他参数获取注册表URL,并通过HTTP请求获取注册表已发布列表,并将结果转换为Package对象返回。

7310

听GPT 讲Rust源代码--srctools(12)

通过提供这个处理器,Rust编译器工具链rust-analyzer crate为开发者提供了一个快速发现和解决代码未实现内建宏机制。...它们为Rust编译器提供了一种标记和处理无法解析外部crate声明方式,使开发者能够更方便地发现和解决这类问题。...具体而言,该文件实现了一个解析器错误处理程序,用于处理由Rust解析器报告未能解析模块错误。 Rust代码,模块是代码一种组织方式,可以通过模块进行代码结构化和封装。...整个Rust编译系统解析器错误处理程序发挥着关键作用,它帮助开发人员快速定位和解决代码解析模块错误问题,从而提高代码质量和开发效率。...是 ide-diagnostics crate 一个处理器,负责处理未解析宏调用问题

15510

使用 rhai、handlebars、graphql 开发 Rust web 前端(3)- rhai 脚本、资源文件、环境变量等

前 2 篇文章《crate 选择及环境搭建》和《获取并解析 GraphQL 数据》,我们已经整合应用 tide、graphql-client、handlebars,以及 surf,从 GraphQL...handlebars-rust 模板引擎是对 handlebars 模板语法规范 Rust 实现,在前文中评测(详见 crate 选择及环境搭建),笔者提及:此次实践选择 handlebars-rust...rhai 嵌入式脚本语言 基于 Rust 语言丰富和创新特性,以及超高性能执行效率,目前开源界,产生了众多 Rust 语言嵌入式脚本引擎。rhai 是新兴,但创新性较高一个。...通过外部作用域,将 Rust 变量/常量无损传递到脚本,无需实现任何特殊特性。 从 Rust 代码内,轻松调用脚本定义函数。 很少依赖项,实际必须具有的仅 2 个第三方 Rust crate。...Rust web 项目中对 rhai 使用,主要是模板渲染过程。如作为模板内嵌助手脚本,对获取到 API 数据进行计算。

51220

第2章 | Rust 导览

crate 名称,以及我们想要使用那个 crate 版本。...crates.io 上这些 crate 版本很可能比此处展示版本新,但通过指明测试此代码时所使用特定版本,可以确保即使发布了新版本包,这些代码仍然能继续编译。...为了继续解决这个问题,可以往 App 添加另一个路由,以处理来自表单 POST 请求。...类型定义之上放置一个 #[derive(Deserialize)] 属性会要求 serde crate 程序编译时检查此类型并自动生成代码,以便从 HTML 表单 POST 提交过来格式化数据解析出此类型值...而在 C 和 C++ ,虽然类型系统也可以帮你解决这个问题,但很容易出错。 如果将数据结构所有权从一个线程转移给另一个线程,那么 Rust 能确保你真的放弃了对它所有访问权限。

6710

听GPT 讲Rust源代码--srctools(3)

它存储了外部crate名称、版本以及有关外部crate使用其他元数据。 ConstData:表示Rust常量。它存储了常量名称、类型、值以及有关常量定义和使用其他元数据。.../crates/hir-def/src/nameres.rs文件是rust-analyzer一个模块,用于处理名称解析相关功能。...通过使用这些结构体和枚举,diagnostics.rs文件可以生成准确、与名称解析相关诊断信息,用于帮助开发者找到潜在错误或问题。...DeriveMacroInvocation是一个结构体,表示派生宏调用,Rust通过属性#[derive]启用。...测试可用于模拟一个简化过程宏展开器。 上述这些struct都是base-db crate定义,用于测试过程模拟不同过程宏展开器。

18310

用 ChatGPT 打造最强 Rust 辅助学习“魔法”系统

选择题: Rust 关于 trait 对象和静态分发,以下哪个说法是正确? A. trait 对象实现了静态分发,性能优于动态分发 B....此处无法直接测试,需要在 C 语言环境编译并调用 } 解释:首先,我们 Rust 代码定义了一个名为 rust_add 函数,该函数接受两个 i32 类型参数,并返回它们和。...选择题: Rust 关于结构体派生 PartialEq 和 Eq trait 说法,哪个是正确? A. 所有结构体都必须实现 PartialEq 和 Eq trait B....选择题答案及解释: Rust 关于结构体派生 PartialEq 和 Eq trait 说法,哪个是正确? 答案:C.... Rust ,如何使用 libbpf-rs crate 编写高效 eBPF 程序? Rust ,如何使用 redbpf-probes crate 实现自定义 eBPF 事件探针?

51910

听GPT 讲Rust Cargo源代码(3)

通过解析命令行参数,初始化工作空间,构建代码项目,并根据修复级别执行修复操作。其目的是为了提供给开发者一种便捷方式来自动修复源代码一些常见问题。...在这个函数,它首先解析命令参数和选项,然后通过调用registry模块API来读取和修改crate元数据。...在这个文件,首先通过use关键字引入了命令模块各个子模块,这些子模块分别对应着不同Cargo命令;然后一个pub fn main()函数,调用了一个名为cli_main内部函数,负责解析命令行参数并调用对应命令函数...LookBehindWindow 维护了一个历史窗口,用于跟踪 Crate 版本,并通过 LookBehind 结构体历史窗口内搜索相同 Crate 冲突版本。...它存储了一系列 Package 提供者,这些提供者可以通过 HTTP 进行访问,或者从本地文件系统读取。

7810

听GPT 讲Rust源代码--srclibrustdoc(2)

该文件实现了一个用于索引和搜索Rust文档数据结构。 CrateData结构体表示一个crate(库)数据,包含了crate名称、版本、模块路径和包含函数、结构体、枚举等信息。...然后,会遍历crate所有模块,获取模块路径和名称,并添加到Paths结构体。同时,也会遍历模块所有项(包括函数、结构体等),将它们路径和名称也添加到Paths结构体。...最后,通过遍历所有的函数,根据函数名称、路径、选项等信息生成搜索索引条目。...通过解析导入语句和导入项,Rustdoc可以生成代码文档时正确地源码显示模块层次结构和导入关系,方便用户查阅和理解Rust代码。...其中,最重要结构体是Lint,它用于表示不同类型lint规则。每个Lint都有一个名称、级别和描述信息,用于标识和报告代码问题

12710

Rust日报】 2019-05-12:Snip开源神经网络推理引擎Tract

该指南包含两部分: Checklist,用于发布crate时快速检查 详细说明,对checklist内容做详细说明 Read More api-guidelines ---- 「视频」用Rust实现...rubygems/issues/2726 ---- 「系列」使用Rust创建静态HTTP服务 Part I #http 该教程没有使用http等基础crate,而是从零开始构建http 1.0服务,可供学习使用...Read More ---- hors: howdoiRust实现 #howdoi #cli Howdoi是Go实现通过命令行获取即时编程问题解答工具,hors是它Rust实现版本。 ?...Read More paw ---- Rust递归迭代问题 #Recursive 问题: struct Node { values: Vec, children: Vec<...最初实现碰到挫折之后,作者想到自己实现了一个迭代器来解决这个问题,但不是一个更好方案。

1.3K30
领券