You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:12:45