Variable Shadowing(变量遮蔽)是编程语言中比较常见的一种情况,但是由于不同语言对于这个情景的处理是不同的,所以在具体语言中这个Variable Shadowing(变量遮蔽)的表现也是不同的。

简单的说,Variable Shadowing(变量遮蔽)就是指之前已经定义了一个变量并赋值,然后再后面又重新定义和赋值,然后这就是Variable Shadowing(变量遮蔽)。

在C语言中:

声明了一个类型的变量并定义赋值,在同一命名空间范围内是不能重新声明和定义的,但是可以赋值操作,并且可以通过指针操作改变该变量的底层存储的变量类型(该变量的类型依旧保持不变,因此在使用该变量时需要强制转换)。在上一层命名空间定义的变量是不影响下层命名空间内重新定义并赋值该同名变量的,并且变量类型不受限,这也是C语言中常见的全局变量和局部变量的。

相关:

https://www.codenong.com/38533407/

https://blog.csdn.net/edsam49/article/details/122708337

在python语言中:

这个问题就比较容易,那就是全局变量并不影响局部变量,而局部变量也不影响全局变量,并且二者的类型也不受限制,这就是python语言的duck type的魅力,就是对变量不做任何限制,编码容易好上手,但也运算效率低。

在mojo语言中:

如果一个变量使用let进行绑定声明,那么这个变量就是不能改变的,类似于C语言中的constant,因此使用let定义的变量是不能进行Variable Shadowing的:

例子来源:https://github.com/modularml/mojo/issues/5

上面这个GitHub的网友认为mojo语言中使用let绑定后不允许改变变量是应该分情况的,并给出两个例子,他认为在第一个例子中编码人员是可以大概率的知道使用的变量x是否被定义过的,因此这种情况应该允许使用shadowing的,而第二个例子中编码人员可能不知道y变量是否被定义,因此这种情况才应该不允许改变let绑定的变量。

PS. 感觉这个网友提的问题很有特色,mojo语言中let绑定就是为了保证一些变量具有constant特性的,而且如果真的像他所提的那种分情况处理,那么会增加该编程语言的编程难度,而且好像意义也不大。

不过由于mojo语言还在研发阶段,也就是说语言特性还在改动,据说现在的mojo中,下面的操作是可以的:

let x=1

let x=2

但是,下面的操作是不可以的:

let x=1

x=2

PS. 对于现在的很多孩子experimental阶段的编程语言,我个人的体会就是不要去碰,不要去尝鲜,不然真的很愁人,这语言特性变动的实在要人琢磨不透。

编程语言中的Variable Shadowing(变量遮蔽)—— declaration shadows a local variable —— Consider Allow Shadowing of let Bindings的更多相关文章

  1. 洗礼灵魂,修炼python(23)--自定义函数(4)—闭包进阶问题—>报错UnboundLocalError: local variable 'x' referenced before assignment

    闭包(lexical closure) 什么是闭包前面已经说过了,但是由于遗留问题,所以单独作为一个章节详解讲解下 不多说,看例子: def funx(x): def funy(y): return ...

  2. CMake中的两种变量(Variable types in CMake)

    在CMake中存在两种变量:normal variables and cache varialbes .正常变量就像是脚本内部变量,相当于程序设计中定义的局部变量那样.而CMakeLists.txt相 ...

  3. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。

    闭包是功能性自包括模块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較相似.  闭包能够 捕获 和 ...

  4. Bash 脚本编程语言中的美学与哲学

    我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨 Bash 脚本语言中的美学与哲学. 这不是一篇 Bash 脚本编程的教程,但是却能让人更加深入地了解 Bash ...

  5. Linux应用环境实战10:Bash脚本编程语言中的美学与哲学(转)

    阅读目录 一.一切皆是字符串 二.引用和元字符 三.字符串从哪里来.到哪里去 四.再加上一点点的定义,就可以推导出整个Bash脚本语言的语法了 五.输入输出重定向 六.Bash脚本语言的美学:大道至简 ...

  6. 透过一道面试题来探探JavaScript中执行上下文和变量对象的底

    在做面试题之前,我们先搞清楚两个概念 执行上下文(execution context) 变量对象(variable object) 执行上下文 我们都知道JavaScript的作用域一共分三种 全局作 ...

  7. Linux 桌面玩家指南:06. 优雅地使用命令行及 Bash 脚本编程语言中的美学与哲学

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  8. Machine Learning 学习笔记2 - linear regression with one variable(单变量线性回归)

    一.Model representation(模型表示) 1.1 训练集 由训练样例(training example)组成的集合就是训练集(training set), 如下图所示, 其中(x,y) ...

  9. iOS中四种实例变量的范围类型@private@protected@public@package

    文档上记录是这样的 The Scope of Instance Variables Toenforce the ability of an object to hide its data, the c ...

  10. Ng第二课:单变量线性回归(Linear Regression with One Variable)

    二.单变量线性回归(Linear Regression with One Variable) 2.1  模型表示 2.2  代价函数 2.3  代价函数的直观理解 2.4  梯度下降 2.5  梯度下 ...

随机推荐

  1. 关于Lecture2建立一个Git远程仓库的补充

    Smiling & Weeping ---- 心之何如,有似万丈迷津, 遥亘千里. 其中并无舟子可渡人, 除了自渡,他人爱莫能助. Git 远程仓库(Github) Git 并不像 SVN 那 ...

  2. Java多线程生成波场靓号

    ​  玩区块链,手上没靓号怎么行.用网上的靓号生成器有一定的风险性,思来想去决定自己写一个.首先需要导入波场官方编辑 <!-- 引用本地Maven仓库--> <dependency& ...

  3. 【论文阅读】GRI: General Reinforced Imitation and its Application to Vision-Based Autonomous Driving

    Column: December 30, 2021 11:01 PM Last edited time: January 10, 2022 4:45 PM Sensor/组织: 3 RGB; 曾经短暂 ...

  4. FPGA案例开发手册——基于全志T3+Logos FPGA核心板

    前 言 本文档主要提供评估板FPGA端案例测试方法,适用的开发环境为Windows 7 64bit和Windows 10 64bit. 本文案例基于创龙科技的全志T3+Logos FPGA核心板,它是 ...

  5. VS2017 error CS0234: 命名空间“Microsoft”中不存在类型或命名空间名“Office”问题的一种解决方案

    最近需要使用VS2017编辑C#,但在编译时软件报错:error CS0234: 命名空间"Microsoft"中不存在类型或命名空间名"Office" 在网上 ...

  6. [大数据][机器学习]之Model Card(模型卡片)介绍

    每当我们在公有云或者私有云发布训练好的大数据模型,为了方便大家辨识.理解和运用,参照huggingface所制定的标准制作一个Model Card展示页,是种非常好的模型展示和组织形式. 下面就是一个 ...

  7. Golang 切片作为函数参数传递的陷阱与解答

    作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. GitHub : https://github.com/af913337456/ 出版的书籍: <1.0-区块链DApp开发实战&g ...

  8. Eggjs 设置跨域请求 指定地址跨域 nodejs

    首先egg自身框架没有直接设置允许跨域请求的功能和接口,所以需要第三方包来设置跨域请求! 先安装第三方包来设置跨域,使用egg-cors // npm npm i egg-cors --save // ...

  9. Nginx 可视化配置神器NginxConfig

    Nginx 是前后端开发工程师必须掌握的神器.该神器有很多使用场景:比如反向代理.负载均衡.动静分离.跨域等等. 把 Nginx 下载下来打开 conf 文件夹的 nginx.conf 文件,Ngin ...

  10. ArchSummit回顾:从云原生到实时数据湖,架构如何支撑业务发展

    [点击了解更多网易热点] 数字化.自动化.智能化的主旋律下,架构的进化也在提速.在近日举办的ArchSummit全球架构师峰会上,网易数帆高级技术专家.资深架构师裴斐和网易数帆高级技术专家周劲松分别分 ...