gpt4 book ai didi

rust - 在不声明变量的情况下重用值

转载 作者:行者123 更新时间:2023-11-29 08:23:35 24 4
gpt4 key购买 nike

在 Kotlin 中,我可以重复使用值:

"127.0.0.1:135".let {
connect(it) ?: System.err.println("Failed to connect to $it")
}

在 Rust 中有类似的东西吗?要避免使用这样的临时变量:

let text_address = "127.0.0.1:135";
TcpListener::bind(text_address).expect(format!("Failed to connect to {}", text_address));

最佳答案

根据 this reference , Kotlin 中的 T.let 是一个类似方法的通用函数,它运行一个闭包 (T) -> R 并传递给定值 T作为第一个参数。从这个角度看,它类似于从TR的映射操作。不过,根据 Kotlin 的语法,它看起来像是一种制作作用域变量的方法,需要额外强调。

我们可以在 Rust 中做完全相同的事情,但它不会带来任何新东西,也不会使代码更清晰(使用 _let 因为 let 是Rust 中的关键字):

trait LetMap {
fn _let<F, R>(self, mut f: F) -> R
where
Self: Sized,
F: FnMut(Self) -> R,
{
f(self)
}
}
impl<T> LetMap for T {}

// then...

"something"._let(|it| {
println!("it = {}", it);
"good"
});

在处理单个值时,实际上更习惯于只声明一个变量。如果您需要将变量(和/或值的生命周期)限制在特定范围内,只需将其放在一个 block 中:

let conn = {
let text_address = "127.0.0.1:135";
TcpListener::bind(text_address)?
};

还有一种情况值得一提:Kotlin 有一个关于可空值的习语,其中 x?.let 用于在值不为空时有条件地执行某些操作。

val value = ...

value?.let {
... // execute this block if not null
}

在 Rust 中,一个 Option已经提供了类似的功能,通过模式匹配或许多可用的条件执行方法:mapmap_or_elseunwrap_or_elseand_then 等等。

let value: Option<_> = get_opt();

// 1: pattern matching
if let Some(non_null_value) = value {
// ...
}

// 2: functional methods
let new_opt_value: Option<_> = value.map(|non_null_value| {
"a new value"
}).and_then(some_function_returning_opt);

关于rust - 在不声明变量的情况下重用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49759054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com