在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));
答案 0 :(得分:4)
根据this reference,Kotlin中的T.let
是一个类似泛型的函数,它运行一个闭包(T) -> R
,并将给定值T
作为第一个参数传递。从这个角度来看,它类似于从T
到R
的映射操作。不过,根据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"
});
当处理单个值时,实际上只是声明一个变量是更惯用的。如果您需要将变量(和/或值的生命周期)约束到特定范围,只需将其放在块中:
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
已经通过模式匹配或许多可用的条件执行方法提供了类似的功能:map
,map_or_else
,unwrap_or_else
,{ {1}}等等。
and_then
答案 1 :(得分:0)
这是类似的
{
let text_address = "127.0.0.1:135";
TcpListener::bind(text_address).expect(format!("Failed to connect to {}", text_address));
}
// now text_address is out of scope