< 返回版块

苦瓜小仔 发表于 2025-08-15 14:35

Tags:日报

文章《Placing Arguments》

作者:Yoshua Wuyts(Rust 团队成员)

文章《Placing Arguments》探讨了 Rust 中“placing arguments”这一设计理念的潜在实现方案及其面临的挑战。作者指出,尽管“placing functions”(即通过 #[placing] 标记的函数,允许在调用者的栈帧中构造值,避免复制并保证地址稳定)看似可行,但“placing arguments”(即在函数参数中直接接收一个“placing”的值,避免额外复制)却因执行顺序和借用检查等问题而难以直接实现。

作者通过示例说明,若允许直接传递表达式作为 placing 参数,会违背 Rust 现有的执行顺序语义,导致意外的 return 或 panic 行为,甚至引发借用检查冲突。为解决这些问题,作者提出采用闭包(closure)作为折中方案,即让函数接收一个返回待构造值的闭包。例如,将 Vec::push 改为类似 Vec::push_with 的方法,接收 impl #[placing] FnOnce() -> T 类型的闭包,从而显式延迟值的构造时机,避免执行顺序和借用问题。

然而,这种方案会导致新旧 API 并存,旧 API(如 Vec::push)逐渐被新 API(如 Vec::push_with)取代。作者进一步提出“edition-dependent path resolution”的设想,即通过 Rust 的 edition 机制,在不同版本中透明地重命名或替换 API,使新 API 能以旧名称提供,从而平滑过渡,避免用户困惑。

总结:placing arguments 因兼容性问题无法直接实现,需通过闭包和 edition 机制逐步引入,以兼顾效率与向后兼容性。

阅读:https://blog.yoshuawuyts.com/placing-arguments/

Reddit:https://www.reddit.com/r/rust/comments/1mq6w1s/placing_arguments/

Agentgateway:快速、功能丰富的 Kubernetes 原生代理

Agentgateway 是一个用 Rust 编写的新的开源代理,它由一支长期使用 Envoy/Istio 的团队构建的,我们发现它无法满足 AI 对网络基础设施日益增长的需求,例如支持 LLM 协议(基于令牌的速率限制和监控、提示护栏、模型故障转移等)、MCP、A2A 等。

虽然它最初的动机是基于人工智能的,但它现在已经发展成为一个成熟的通用代理。在这个(非常拥挤的!)领域,它的主要差异化因素之一是其原生的 Kubernetes 支持。在 40 个 Kubernetes 网关 API 实现中,agentgateway 是唯一用 Rust 编写的(Linkerd 支持该 API,但仅限于服务网格,而不是网关)!此外,它是唯一专为 Kubernetes 设计的代理。这种专业化带来了显著的性能提升——在路由规模测试中,agentgateway 仅使用一小部分资源即可处理相同的负载:

从技术角度来看,agentgateway 建立在 Rust 的标准框架之上——Tokio、Hyper、Tonic 等; cel-rust 也是其中的重要组成部分 。以下是一些可能存在争议的决定:

  • 我们没有使用 Tower(或任何其他类似的中间件设计)。虽然这些中间件对于获取现成的可复用层非常有用,但我觉得自己实现层过于复杂。例如,比较一下 TowerAgentgateway 中将标头设置为敏感的简单服务(当然,Tower 的功能略多一些)。

  • 我们没有使用 Pingora ,虽然它现在在 Rust 的新代理中似乎很常见。Pingora 提供的功能集与我们想要的功能没有太多重叠,而且我们希望完全拥有自己的堆栈,而不是被一个(有点)固执己见的库所束缚。此外,选择 Pingora 意味着放弃 Hyper,考虑到我们过去使用 Hyper 的经验,这并不是我们想要的。

仓库:https://github.com/agentgateway/agentgateway

Reddit:https://www.reddit.com/r/rust/comments/1mq4gvm/agentgateway_a_fast_feature_rich_kubernetes/

Cel-cxx:适用于 Google CEL 的现代、类型安全的 Rust 库

一种用于通用表达语言 (CEL) 的类型安全 Rust 库,建立在 cel-cpp 之上,通过 cxx 实现零成本 FFI 绑定。

核心设计原则:

  • 类型安全 :CEL 表达式和函数签名的编译时验证
  • 零成本抽象 :以最小的开销直接将 FFI 调用到 CEL-CPP
  • 内存安全 :Rust 所有权系统可防止常见的集成错误
  • 符合人体工程学的 API :构建器模式和自动类型推断减少了样板
  • 可扩展性 :支持自定义类型和异步操作

该库提供了一个连接 Rust 和 CEL-CPP 的分层架构:

  • 应用层 :用于环境构建和表达式评估的高级 API
  • 类型系统层 :Rust 和 CEL 类型之间的自动转换
  • FFI 层 :通过 cxx crate 实现与 CEL-CPP 的零成本绑定
  • CEL-CPP 层 :Google 的解析和评估参考实现

仓库:https://github.com/xjasonli/cel-cxx

Reddit:https://www.reddit.com/r/rust/comments/1mptg6z/announcing_celcxx_020_a_modern_typesafe_rust/

讨论:真希望 Rust 有可变泛型和命名参数,用于 UI 开发

感觉命名参数 RFC 并没有得到太多关注,而可变参数也停滞不前。在尝试了不同的 UI Kit 以及 Composer 和 Builder 风格的 API 之后,我意识到可变参数 + 命名参数可以大大减少宏 DSL 的使用——Dart 在这方面做得非常好。但考虑到目前人们的注意力都集中在分配器和异步 trait 上,我怀疑这些功能短期内很难见到。:(

高赞回复:

“对于命名函数参数 - 看看 bon 这个库。想要更轻量级的方法(就编译时间而言),可以尝试将函数转换为一个结构体,该结构体接受所有相同的参数,但需要命名。然后在结构体上添加一个类似 .call() 的方法。我一直在使用这种方法,效果很好”

Reddit:https://www.reddit.com/r/rust/comments/1mprqw6/really_wish_rust_had_variadic_generics_and_named/

--

From 日报小组 苦瓜小仔

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页