在 rust 中,我们一开始就在使用宏,例如 println!, vec!, assert_eq! 等。看起来宏和函数在使用时只是多了一个 !。实际上这些宏都是声明式宏(也叫示例宏或macro_rules!),rust 还支持过程宏,过程宏为我们提供了强大的元编程工具。
Rust是一门以安全性和性能著称的系统级编程语言,它提供了强大的宏系统,使得开发者可以在编译期间生成代码,实现元编程(Metaprogramming)。宏是Rust中的一种特殊函数,它可以接受代码片段作为输入,并根据需要生成代码片段作为输出。本篇博客将深入探讨Rust中的宏,包括宏的定义、宏的分类、宏的使用方法,以及一些实际场景中的应用案例,以便读者全面了解Rust宏的神奇之处。
原文: The Plan for the Rust 2021 Edition[1]
Rust是一门以安全性和性能著称的系统级编程语言,它提供了强大的宏系统,使得开发者可以在编译期间生成代码,实现元编程(Metaprogramming)。宏是Rust中的一种特殊函数,它可以接受代码片段作为输入,并根据需要生成代码片段作为输出。本篇博客将深入探讨Rust中的声明宏,包括声明宏的定义、声明宏的特点、声明宏的使用方法,以及一些实际场景中的应用案例,以便读者全面了解Rust声明宏的魔力。
println!可能是学习Rust最常用的一行代码了。我们连续多次调用它,下面的代码编译通过,再正常不过了。
有没有同学记得我们一起挖了多少个坑?嗯…其实我自己也不记得了,今天我们再来挖一个特殊的坑,这个坑可以说是挖到根源了——元编程。
版本1.40.0(2019-12-19) 语言 现在,您可以在上下文中使用tuple struct和tuple enum变体的构造函数 const。例如
Rust语言是一种高效、可靠的通用高级语言,同时兼顾了开发效率和执行效率。Rust除了能够胜任性能敏感的任务以外,也在内存和线程安全方面有着极高的可靠性。
从上周四开始的周末(1/7-1/10),是 Tubi 一年一度的 OSS-a-thon。所谓 OSS-a-thon,是我们为了回馈开源社区举办的 hackathon,参与者需要做和开源项目有关的项目 — 可以是对已有的开源项目进行改进,提交 PR,或者做新的项目,但需要开源。
这个crate提供了方便的宏和trait,可帮助编写SQL查询并将其结果收集到静态类型的结构中。
去年 10 月,我在 review 数据库迁移代码时,不断回溯十多个已有的迁移文件,艰难地试图了解目前数据库 schema 的最终形态时,萌生了做一个数据库模式迁移工具的想法。当时主流的模式迁移工具,无论是直接撰写 SQL,还是撰写某个语言的 DSL,都要求开发者以数据库上一次迁移的状态为基础,撰写对该状态的更改。比如要对已有的 todos 表加一个字段 created_at,我需要创建一个新的迁移文件,撰写类似如下的代码:
在Rust中,打印语句使用宏(例如println!和format!)的主要原因是为了在编译时进行字符串格式检查,并在不引入运行时开销的情况下提供更高的性能和安全性。宏可以被多次调用,这样你可以在不同的地方重复使用相同的代码模式。这有助于减少代码重复,提高代码的可维护性。
宏的作用就是在编译期间对原代码进行扩展,实现目标功能。简单的说宏就是生成代码的代码。
Rust 吉祥物是只螃蟹,Ferris,这可以理解,但是它为什么被煮了啊?都变红了。
C++方式的函数重载,即同一个函数名以及多个不同的形参类型和个数(不包括返回值类型), 以Ad-hoc(临时,随时)过于灵活的方式来实现函数的重载!功能非常强大, 同时也是惹祸根源之一!
Rust 1.37.0 稳定版已发布 現在可以使用 type 製作別名 type ByteOption = Option<u8>; fn increment_or_zero(x: ByteOption) -> u8 { match x { ByteOption::Some(y) => y + 1, ByteOption::None => 0, } } 而在實作(实现)函數中 Self 可以當成目前結構的別名 impl Coin { fn value
规则宏mbe即是由macro_rules!宏所定义的宏。它的英文全称是Macro By Example。相比近乎“徒手攀岩”的Cpp模板·元编程,rustc提供了有限的编译时宏代码检查功能(名曰:Mixed Hygiene宏的混合保健)。因为rust宏代码·被展开于·编译过程中的语法分析阶段(请见下图),所以rustc相较于g++/gcc拥有更多可用作“代码静态分析”的信息。
#[non_exhaustive] structs, enums, and variants
本文设计了一个比较巧妙的 Events 模式, 不由地让人想起 Qt的 signal.
本系列主要是分析RustSecurity 安全数据库库中记录的Rust生态社区中发现的安全问题,从中总结一些教训,学习Rust安全编程的经验。
Rust 1.37.0 stable 有什么?Rust 1.37.0 的亮点包括通过类型别名引用枚举变量、内置 cargo vendor、对宏使用未命名的 const、配置文件引导的优化、Cargo 中的 default-run 和枚举上的 #[repr(align(N))] 。
本文为 TiKV 源码解析系列的第五篇,为大家介绍 TiKV 在测试中使用的周边库 fail-rs。
我已经学习 Rust 有挺长的一段时间了,一直想用 Rust 来写点东西,但是缺乏好的想法; 有些想法自我感觉良好,但是又没有能力实现 (比如,写一个操作系统?), 所以最后我决 定还是拿我的博客来做实验品吧。我原来的博客 是 基于 Github Page 和 Org mode 实现的静态博客,略显简单。所以我就觉得用 Rust 来写 个新的博客。
在Rust源代码中,rust-analyzer项目是一个用于提供快速、准确的Rust语言分析服务的工具。在该项目的路径rust-analyzer/crates/hir-def/src下,data.rs文件提供了用于存储和管理Rust代码的语义信息的数据结构。
其他的多数语言中的, 数组直接就是可迭代的,无论是下标遍历还是迭代器迭代,都可以运行,所以刚开始用Rust的时候就翻车了。
构建文本分类器和理解自然语言处理 (NLP) 的世界涉及很多步骤。这些步骤必须按特定顺序执行。如果数据中的目标类别不平衡,则需要更多步骤。从头开始学习这一切可能有点雷区。网上有很多学习资源,但事实证明,要找到涵盖高层次所有内容的整体指南非常棘手。因此,我写这篇文章[1]的目的是希望通过 10 个简单的步骤指南为这个过程提供一些透明度。
构建文本分类器和理解自然语言处理 (NLP) 的世界涉及很多步骤。这些步骤必须按特定顺序执行。如果数据中的目标类别不平衡,则需要更多步骤。从头开始学习这一切可能有点雷区。网上有很多学习资源,但事实证明,要找到涵盖高层次所有内容的整体指南非常棘手。因此,我写这篇文章的目的是希望通过 10 个简单的步骤指南为这个过程提供一些透明度。
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily
这个系列是对 RustChinaConf 2022 线上大会议题的回顾,后面等官方 RustConf 2022 的视频出来也会有相关回顾文章。
看到社区有朋友对 Brain 这篇文章已经做了翻译,但是出于对 Rust 发展背后付出的无名英雄的敬意,我又认真翻译了一遍。这篇翻译得到了 Brian 本人的授权。
通过前几天的学习,我们了解到: 通过单一所有权模式,Rust 解决了堆内存过于灵活、不容易安全高效地释放的问题,既避免了手工释放内存带来的巨大心智负担和潜在的错误; 又避免了全局引入追踪式 GC 或者 ARC 这样的额外机制带来的效率问题。
网络地址转换(Network Address Translation,NAT)是一种在计算机网络中广泛使用的技术,它允许将一个网络地址映射到另一个网络地址。静态NAT、动态NAT和端口地址转换(Port Address Translation,PAT)是NAT的常见实现方式。
Bazel 支持很多内置的规则,语言相关规则有 Shell、Objective-C、C++ 和 Java,比如 sh_binary、cc_binary、cc_import、cc_library、java_binary、java_import等。但是 Go 编译内置规则没有支持,不过好在 Bazel 支持规则扩展,可以自定义 Go 相关规则,包括可以实现如 go_binary、go_library、go_test等规则。而 `rules_go`[1] 就是 Bazel 官方维护的 Go Bazel 开源扩展规则。`gazelle`[2] 这个项目可以将 Go 项目转为 Bazel 方式构建,包括生成 BUILD.bazel 文件,根据 go.mod 文件自动生成下载依赖模块规则 go_repository。这里简单介绍下 rules_go 和 gazelle 相关内容,更多可以参考官方相关文档。
来源:https://mnt.io/2018/09/11/from-rust-to-beyond-the-c-galaxy/
To avoid confusing macros with names that obey scope and type rules.
这是几乎每种编程语言都会遇到的实现场景,通过对比Java和Rust的实现与运行表现,我们可以清晰地看出Rust的不同或者说Rust的良苦用心,以及为了实现这一切所带来的语言特性。我们首先来看Java的实现方法。
编译器信息最新动态推荐关注hellogcc公众号 2023-02-01 第187期
我认为尾调用优化(tail call optimizations)相当整洁,特别是它们解决递归函数如何调用这类基本问题的方式。诸如Haskell和Lisp家族这类函数式语言,以及逻辑语言(Prolog可能是最著名的例子)都强调采用递归的方式思考问题。这些语言通过尾调用优化可以在性能上获得许多好处。
昨晚睡前无意识网络闲逛,发现了 Brian Anderson 于 2021 年 5 月 2 日 撰写的文章 Rust’s Most Unrecognized Contributor。文章或许存在争议,但文笔很棒,我们也可以多看多思:作为成年人,我们都晓得,任何伟大的背后,无一例外都沉积着丰厚的、但举足轻重的不知名,或者说默默无闻。笔者不由得希望将此文分享,共同向诸多先行者致敬。
本教程的目的是让您即使没有什么 Rust 经验,也能开始使用 egg。如果你还没听说过e-graph,可以先阅读背景教程。如果你有 Rust 相关经验,可以略读本节。
Macros are a major source of bugs. Macros don't obey the usual scope and type rules. Macros don't obey the usual rules for argument passing. Macros ensure that the human reader sees something different from what the compiler sees. Macros complicate tool building.
随着容器技术的兴起,容器运行时的安全监控也成为各方关注的焦点。在各行各业积极上云的今天,如何及时准确发现容器环境内部的安全威胁并进行告警和处置,是容器平台开发运维和应急响应团队必须考虑的问题。Falco作为一款为云原生平台设计的进程异常行为检测工具,支持接入系统调用事件和Kubernetes审计日志,与其他工具相比具有独特优势,能够在前述问题上带给我们很多有益思考。本文希望通过两个场景来探索Falco的特性。
Retrofit是适用于Android和Java且类型安全的HTTP客户端工具,在Github上已经有39k+Star。其最大的特性的是支持通过接口的方式发起HTTP请求,类似于我们用Feign调用微服务接口的那种方式。
在Rust源代码中,rust/compiler/rustc_builtin_macros/src/format_foreign.rs这个文件的作用是处理外部格式化宏的实现。这些宏是Rust语言用来格式化输出的宏,它们在编译时被翻译成具体的代码实现。
之前我们在windows机器上用Minikube安装了一个单节点Kubernetes集群,这个只能当做了解k8s的练手,本篇文章我们安装一个拥有一个Master,两个Worker节点的k8s集群,作为熟悉Kubernetes的测试集群。
蛮久前入门了一下 Rust 语言。它的设计模型非常地吸引C/C++的开发者。但是学习语言嘛还是要练习一下,之前也用它给我们项目写了个命令行小工具。这回拿来写个小型的服务器程序吧。
领取专属 10元无门槛券
手把手带您无忧上云