我正在阅读Rust文档,并遇到了以下示例和声明
使用return作为函数的最后一行有效,但被认为是糟糕的样式:
fn foo(x: i32) -> i32 {
if x < 5 { return x; }
return x + 1;
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以写上面的内容
fn foo(x: i32) -> i32 {
if x < 5 { return x; }
x + 1
}
Run Code Online (Sandbox Code Playgroud)
但我更倾向于写前者,因为这更直观.我确实理解函数返回值应该用作表达式,以便后面有效但是为什么不鼓励前者呢?
我有以下内容:
enum SomeType {
VariantA(String),
VariantB(String, i32),
}
fn transform(x: SomeType) -> SomeType {
// very complicated transformation, reusing parts of x in order to produce result:
match x {
SomeType::VariantA(s) => SomeType::VariantB(s, 0),
SomeType::VariantB(s, i) => SomeType::VariantB(s, 2 * i),
}
}
fn main() {
let mut data = vec![
SomeType::VariantA("hello".to_string()),
SomeType::VariantA("bye".to_string()),
SomeType::VariantB("asdf".to_string(), 34),
];
}
Run Code Online (Sandbox Code Playgroud)
我现在想调用transform每个元素data并将结果值存回data.现在,我当然可以做类似的事情,data.into_iter().map(transform).collect()但这将分配一个新的Vec.有没有办法在就地执行此操作,重用已分配的内存data?有一次Vec::map_in_place在Rust,但它已被删除了一段时间(我认为在1.4左右).
作为解决方法,我目前添加Dummy-variant SomeType,然后执行以下操作:
for x in …Run Code Online (Sandbox Code Playgroud) rust ×2