Rust中能否实现Kotlin的Scope functions(let、apply、run等)?
在Rust中实现类似Kotlin的作用域函数
当然可以,Rust的闭包和trait系统完全支持实现这类简洁的作用域功能,甚至能根据Rust的特性做更适配的设计。下面是几个常用作用域函数的实现示例:
let 函数
Kotlin的let是把对象作为闭包参数传入,返回闭包的结果。在Rust中我们用let_(避免和关键字let冲突)来实现:
trait Let { fn let_<R>(self, f: impl FnOnce(Self) -> R) -> R; } impl<T> Let for T { fn let_<R>(self, f: impl FnOnce(Self) -> R) -> R { f(self) } } // 使用示例 fn main() { let result = "hello".let_(|s| s.to_uppercase()); println!("{}", result); // 输出 HELLO }
apply 函数
Kotlin的apply用于对象初始化,把对象作为可变引用传入闭包,最后返回对象本身:
trait Apply { fn apply(self, f: impl FnOnce(&mut Self)) -> Self; } impl<T> Apply for T { fn apply(mut self, f: impl FnOnce(&mut Self)) -> Self { f(&mut self); self } } // 使用示例 fn main() { let vec = Vec::new().apply(|v| { v.push(1); v.push(2); v.push(3); }); println!("{:?}", vec); // 输出 [1, 2, 3] }
run 函数
Kotlin的run分两种场景,这里实现对象绑定的版本,支持不可变和可变引用两种形式:
trait Run { fn run<R>(&self, f: impl FnOnce(&Self) -> R) -> R; fn run_mut<R>(&mut self, f: impl FnOnce(&mut Self) -> R) -> R; } impl<T> Run for T { fn run<R>(&self, f: impl FnOnce(&Self) -> R) -> R { f(self) } fn run_mut<R>(&mut self, f: impl FnOnce(&mut Self) -> R) -> R { f(self) } } // 使用示例 fn main() { let mut num = 5; let doubled = num.run_mut(|n| { *n *= 2; *n }); println!("{}", doubled); // 输出 10 println!("{}", num); // 输出 10 }
额外说明
这些实现都是基于Rust的trait扩展机制,你可以把这些trait封装到一个工具模块里,需要时引入即可。另外,Rust标准库中也有类似功能的工具,比如Option::map和Result::and_then,它们的作用和let很接近,但自定义实现能更贴合Kotlin的使用习惯。
内容的提问来源于stack exchange,提问作者NoBullsh1t
相关产品推荐
相关产品推荐

