openlang

循环变量的生命周期

看看这段有点傻的代码。

3.times do |round|
    cell = uninitialized Int32
    if cell == 60
        puts "cell = 60, round = #{round}"
        puts " (by chance!)" if round == 0
    end
    cell = 60
end

是每次迭代都重新创建 cell,碰巧放在上一次迭代中 cell 使用的地址上,所以第三次经过时值才是 60?

还是同一个变量一直存在于全部三次迭代中,因此我可以依赖这种行为?

从英语翻译查看原文

后续讨论 1

顺着彼此的依据读下去
  1. 固定链接

    使用 uninitialized 时,变量指向的内存里原先有什么数据,就还是什么数据。这正是 uninitialized 存在的原因,它既不会清空那块内存,也不会赋上初始默认值。

    这里的 cell 碰巧在每次迭代中都处于相同地址。栈的工作方式可能让这种行为一直能被观察到,但依赖它是错误的。并不是同一个变量在各次迭代之间一直存在。

    编译器或代码生成器如果愿意,可以重新安排数据的位置。

    从英语翻译查看原文

同一个问题的其他角度

  1. 让清理块真正执行时才开始可变借用

    怎样在 Rust 中写一个 panic 安全的机制,类似 Java 的 try { ... } finally { ... },同时允许 try 和 finally 块分别可变借用同一个值? 我需要的是,无论正常离开还是因 panic 栈展开而离开…

    回复 2最近活动 rust
  2. 通过指针输入字符数组

    每次尝试从键盘往一些 char 数组里输入内容,程序最后都会崩溃。 有什么简单方便的方法,可以从键盘读取 char 数组并保存下来?

    回复 2最近活动 c
  3. 输入函数能不依赖全局变量吗?

    我想写一个函数,处理并过滤用户输入,然后把得到的字符串返回给调用它的函数。 能不能不声明下面例子中的这种全局变量,也实现这个功能?

    回复 2最近活动 c