< 返回版块

wxfla 发表于 2020-07-13 14:18

Tags:遮蔽 while

首先代码如下 let i = 1; while i<=10 { println!("{}",i); let i=i+1; }

我是刚刚入门rust语言,对于遮蔽机制也还不慎掌握。看了Rust程序设计语言的遮蔽介绍,我理解遮蔽可以当做一种对不可变变量改值的方式,但是当我运行这个代码后,发现,系统一直在死循环输出1。

所以我可能对遮蔽机制不太理解,希望懂的大佬指点一二。


Ext Link:

评论区

写评论
vxfla 2020-07-14 12:17

我好像明白了,遮蔽实际上是让一个变量的名字可以重新用了,但是实际上已经在内存上申请了新的空间是吗。 那么之前有这个名字的变量的内存还在,只不过在被遮蔽期间不能用了,等到作用域结束被回收内存,是这个意思嘛。

--
👇
Neutron3529: 遮蔽其实是这个意思

let x=1
{
    let x=2
    assert!(x==2)
}
assert!(x==1)

是开了一个新变量,并不是把旧变量改成新的值

fn main() {
    let i=1;
    while i<10{
        println!("{}",i);
        {
            let i=i+1;
        }//drop `let i=i+1`
        assert!(i==1);
        break
    }
}

这样看就很显然了.

如果你真的想用while:

fn main() {
    let i=1;
    let mut i=i;//let i mutable
    while i<10{
        println!("{}",i);
        i=i+1;
        assert!(i!=1);
    }
    let i=i;//let i immutable
}

如果你一定要给不可变的变量赋值……

fn test(i:bool){
    let wtf;
    if i{wtf=3}else{wtf=4}
    println!("{}",wtf);
}
fn main(){
    test(true);
    test(false);
}
vxfla 2020-07-14 12:11

多谢!学到了!

--
👇
Neutron3529: 讲道理,Rust超级冤枉的

你明明指定了i不可变

那么Rust表示,i既然不可变,i<10也不可变,我算一次就够了

然后Rust就死循环了

如果你编译Rust,你会发现一个warning: unused variable: i

这正说明了,你的let i=i+1并没有起作用


BTW,可以用论坛理解Rust的let:如果你想更改帖子,你只能重发然后删掉原来的内容

但,如果你不删,原来的内容会一直保存着。

所以说论坛就一个大号Rust

……i了i了……

vxfla 2020-07-14 12:10

嗷嗷,明白了,谢谢你!

--
👇
noalias: println中的i是引用的外部作用域的i,每一次循环while语句中声明的i会drop,所以这个i并没有产生任何作用

noalias 2020-07-14 06:55

println中的i是引用的外部作用域的i,每一次循环while语句中声明的i会drop,所以这个i并没有产生任何作用

Neutron3529 2020-07-13 15:32

讲道理,Rust超级冤枉的

你明明指定了i不可变

那么Rust表示,i既然不可变,i<10也不可变,我算一次就够了

然后Rust就死循环了

如果你编译Rust,你会发现一个warning: unused variable: i

这正说明了,你的let i=i+1并没有起作用


BTW,可以用论坛理解Rust的let:如果你想更改帖子,你只能重发然后删掉原来的内容

但,如果你不删,原来的内容会一直保存着。

所以说论坛就一个大号Rust

……i了i了……

Neutron3529 2020-07-13 15:30

遮蔽其实是这个意思

let x=1
{
    let x=2
    assert!(x==2)
}
assert!(x==1)

是开了一个新变量,并不是把旧变量改成新的值

fn main() {
    let i=1;
    while i<10{
        println!("{}",i);
        {
            let i=i+1;
        }//drop `let i=i+1`
        assert!(i==1);
        break
    }
}

这样看就很显然了.

如果你真的想用while:

fn main() {
    let i=1;
    let mut i=i;//let i mutable
    while i<10{
        println!("{}",i);
        i=i+1;
        assert!(i!=1);
    }
    let i=i;//let i immutable
}

如果你一定要给不可变的变量赋值……

fn test(i:bool){
    let wtf;
    if i{wtf=3}else{wtf=4}
    println!("{}",wtf);
}
fn main(){
    test(true);
    test(false);
}
1 共 6 条评论, 1 页