编程语言中的Variable Shadowing(变量遮蔽)—— declaration shadows a local variable —— Consider Allow Shadowing of let Bindings
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的更多相关文章
- 洗礼灵魂,修炼python(23)--自定义函数(4)—闭包进阶问题—>报错UnboundLocalError: local variable 'x' referenced before assignment
闭包(lexical closure) 什么是闭包前面已经说过了,但是由于遗留问题,所以单独作为一个章节详解讲解下 不多说,看例子: def funx(x): def funy(y): return ...
- CMake中的两种变量(Variable types in CMake)
在CMake中存在两种变量:normal variables and cache varialbes .正常变量就像是脚本内部变量,相当于程序设计中定义的局部变量那样.而CMakeLists.txt相 ...
- Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。
闭包是功能性自包括模块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較相似. 闭包能够 捕获 和 ...
- Bash 脚本编程语言中的美学与哲学
我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨 Bash 脚本语言中的美学与哲学. 这不是一篇 Bash 脚本编程的教程,但是却能让人更加深入地了解 Bash ...
- Linux应用环境实战10:Bash脚本编程语言中的美学与哲学(转)
阅读目录 一.一切皆是字符串 二.引用和元字符 三.字符串从哪里来.到哪里去 四.再加上一点点的定义,就可以推导出整个Bash脚本语言的语法了 五.输入输出重定向 六.Bash脚本语言的美学:大道至简 ...
- 透过一道面试题来探探JavaScript中执行上下文和变量对象的底
在做面试题之前,我们先搞清楚两个概念 执行上下文(execution context) 变量对象(variable object) 执行上下文 我们都知道JavaScript的作用域一共分三种 全局作 ...
- Linux 桌面玩家指南:06. 优雅地使用命令行及 Bash 脚本编程语言中的美学与哲学
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Machine Learning 学习笔记2 - linear regression with one variable(单变量线性回归)
一.Model representation(模型表示) 1.1 训练集 由训练样例(training example)组成的集合就是训练集(training set), 如下图所示, 其中(x,y) ...
- iOS中四种实例变量的范围类型@private@protected@public@package
文档上记录是这样的 The Scope of Instance Variables Toenforce the ability of an object to hide its data, the c ...
- Ng第二课:单变量线性回归(Linear Regression with One Variable)
二.单变量线性回归(Linear Regression with One Variable) 2.1 模型表示 2.2 代价函数 2.3 代价函数的直观理解 2.4 梯度下降 2.5 梯度下 ...
随机推荐
- mklink命令使得OneDrive同步任意一个文件夹
本文介绍利用mklink命令,使得OneDrive自动同步电脑中任意指定文件夹的方法. OneDrive是由微软提供的云存储和文件同步服务.它提供了大量的云存储空间,允许用户将文件和数据存储在 ...
- 牛客小白月赛96(待F)
比赛链接:牛客小白月赛96 赛时感受 赛时在前面卡的时间有点长,C题没开longlong wa了n发,D题没考虑负数又wa了n发,然后来写E的时候时间就不长了,匆忙写一次交一发. A 思路 当其中一个 ...
- 架构师必知的11种API性能优化方法
前言 接口性能优化是后端开发人员经常碰到的一道面试题,因为它是一个跟开发语言无关的公共问题. 这个问题既可以很简单,也可以相当复杂. 有时候,只需要添加一个索引就能解决. 有时候,代码需要进行重构. ...
- LangChain转换链:让数据处理更精准
上篇文章<5分钟了解LangChain的路由链>里主要介绍了路由链,核心类是LLMRouterChain和MultiPromptChain.本文介绍LangChain里的另外1个重要的链: ...
- Linux 提权-SUID/SGID_2
本文通过 Google 翻译 SUID | SGID Part-2 – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释 ...
- Linux 中 WIFI 和热点的使用
之前一直在 ubuntu 的图形界面中使用,突然需要在 ARM 板上打开热点,一时给弄蒙了,在此记录一下 一.网卡命令 显示所有网络信息 sudo ip link show 关闭或打开网络 sudo ...
- 类、事件与对象---Dad&Mom&Friends(进阶事件)
接上一个笔记:https://www.cnblogs.com/StephenYoung/p/17792668.html 现在增加了一个新的朋友类:Friends 这个类构造如下: 从上到下依次是: 1 ...
- 10 pdf分享失败
PC端分享pdf,复制粘贴pdf链接后跳转搜索首页
- Linux 文件夹和文件操作【Linux 常用命令系列一】
〇.前言 本文首先介绍了 Linux 中文件的结构,将全部文件夹罗列并介绍了大概的用途: 然后通过实例介绍了文件夹相关的常用操作,仅供参考. 一.Linux 系统的文件结构 列一下系统全部文件夹: / ...
- TypeScript 学习笔记 — 类型推断和类型保护(十一)
目录 类型推断 1.赋值推断 2.返回值推断 3.函数推断(反向推断) 4.属性推断 5.类型反推 6.索引访问操作符 7.类型映射 类型保护 1.typeof 类型保护 2.instanceof 类 ...