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

时间:2018-04-10 16:51:16

标签: rust

在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));

2 个答案:

答案 0 :(得分:4)

根据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"
});

当处理单个值时,实际上只是声明一个变量是更惯用的。如果您需要将变量(和/或值的生命周期)约束到特定范围,只需将其放在块中:

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_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