是否可能在Rust中执行块表达式的捕获?

是否可能在Rust中执行块表达式的捕获?,rust,expression,shadowing,Rust,Expression,Shadowing,我所说的这类事情的简单例子: let x = 10; if true { let x = 20; } println!("x is {}", x); 这将打印x是10,而不是x是20,并给我一个未使用的变量警告,因为if块中的x不同于它外部的x。是否有一种方法可以对if执行类似捕获的操作,从而使其实际作用于包含块的x 我在这里想象,通过重复的let语句执行阴影是可取的,但如果只是一个int,则示例更简洁。在伪代码中,可能更像: let data = get_data

我所说的这类事情的简单例子:

let x = 10;
if true {
    let x = 20;
}
println!("x is {}", x);
这将打印x是10,而不是x是20,并给我一个未使用的变量警告,因为if块中的x不同于它外部的x。是否有一种方法可以对if执行类似捕获的操作,从而使其实际作用于包含块的x

我在这里想象,通过重复的let语句执行阴影是可取的,但如果只是一个int,则示例更简洁。在伪代码中,可能更像:

let data = get_data_from_user();
let data = initial_processing(data);
let data = further_processing(data);
if some_condition {
    let data = conditional_processing(data);
} else {
    let data = fallback_processing(data);
}
也许答案是这是代码气味,我应该在条件处理函数调用中移动if some_条件检查

因此,例如,可再现示例的一种可能重写:

let mut x = 10;
if true {
    x = 20;
}
我认为这与我的想法太不一致了。

写作是可能的

let x = 10;
let mut y = x;
if true {
    y = 20;
}
let x = y;
println!("x is {}", x);
因此x最终是一个不可变变量,设置为20,尽管代价是引入一个一次性的中间可变变量y。但我仍然很好奇,是否有可能通过让if块捕获并故意在其外部隐藏变量来实现这一点。

更新请参见下面的原始答案

你可能对我感兴趣

让数据=从用户处获取数据; 让数据=初始处理数据; 让数据=进一步处理数据; 设data=if某个条件{ 条件处理数据 }否则{ 回退\u处理数据 }; 或者如果您希望为其他对象保留相同的值

设x=10; 设x=如果为真{ 20 }否则{ x } 原始答案

不,不可能

不能强制变量在定义块外可见。所以让x=不起作用。 不能更改不可变变量的值。因此x=将不起作用。 没有其他方法可以为变量赋值。 更新请参见下面的原始答案

你可能对我感兴趣

让数据=从用户处获取数据; 让数据=初始处理数据; 让数据=进一步处理数据; 设data=if某个条件{ 条件处理数据 }否则{ 回退\u处理数据 }; 或者如果您希望为其他对象保留相同的值

设x=10; 设x=如果为真{ 20 }否则{ x } 原始答案

不,不可能

不能强制变量在定义块外可见。所以让x=不起作用。 不能更改不可变变量的值。因此x=将不起作用。 没有其他方法可以为变量赋值。
您可以通过重新绑定相同的变量来实现这一点

//第一步,准备x作为可变的 设mut x=10; 如果是真的{ x=20; } 设x=x;//x的新绑定 //从现在起,x是不可变的 表达相同想法的更常见或可读的方式:

设x={ //在这个块内准备一个可变的x 设mut x=10; 如果是真的{ x=20; } x//整个块的结果 }; //在这个范围内,x是不可变的 这两种结构有一个共同点,即你开始 使用可变绑定以多次初始化值 步骤,然后在完成后,切换到不可变绑定 具有相同的值,以防止意外
改变它。

您可以通过重新绑定相同的变量来实现这一点

//第一步,准备x作为可变的 设mut x=10; 如果是真的{ x=20; } 设x=x;//x的新绑定 //从现在起,x是不可变的 表达相同想法的更常见或可读的方式:

设x={ //在这个块内准备一个可变的x 设mut x=10; 如果是真的{ x=20; } x//整个块的结果 }; //在这个范围内,x是不可变的 这两种结构有一个共同点,即你开始 使用可变绑定以多次初始化值 步骤,然后在完成后,切换到不可变绑定 具有相同的值,以防止意外
改变它。

尽管您可能会补充说,通常的解决方案是以不同的方式调用每个变量,可能比数据更具描述性,或者使变量可变。将最终值从块返回到不可变变量也可能是一个选项。@L.Riemer,谢谢您的评论。从块返回值是一个绝妙的想法。我相应地更新了我的答案。尽管您可能会补充说,通常的解决方案是以不同的方式调用每个变量,可能比数据更具描述性,或者使变量可变。将最终值从块返回到不可变变量也可能是一个选项。@L.Riemer,谢谢您的评论。从块返回值是一个绝妙的想法。我相应地更新了我的答案。