powershell - 复合赋值运算符在子作用域中的行为如何?
问题描述
以下两个函数会发生什么?我希望它们是一样的。
PS C:\> $i = 5
PS C:\> function Test1 { $i += 1; $i }
PS C:\> function Test2 { $i = $i + 1; $i }
PS C:\> Test1
1 # why?
PS C:\> Test2
6
PS C:\> $i
5 # will not change
我知道函数中的 $i 具有本地范围,因此不会在全局范围内更改,这是故意的。这个问题只是关于为什么以下2个赋值语句在这里表现不同,据我所知,它们应该是等价的。
$i = $i + 1
$i += 1
解决方案
解释:
在Test1
变量$i
中被赋值(使用复合赋值运算符)。因为不能从全局范围内改变变量,所以创建了一个新的局部变量(隐藏全局变量),它最初没有值(基本上是0),然后加1。返回值时,本地使用变量。
function Test1 {
# because it's an assignment, a new local variable
# is created (with initial value = 0)
$local:i += 1
$local:i
}
在使用全局变量Test2
的值时(因为该变量在这个子作用域中是可见的),加1,结果(6)赋值给一个新的局部变量。如,最后返回局部变量的值。$i
Test1
function Test2 {
# a new local variable is created, but because the global
# variable is visible here, its value is used initially
$local:i = $global:i + 1
$local:i
}
在此处阅读有关范围的更多信息:about_scopes
推荐阅读
- python - 正则表达式从字符串中删除 'by'
- java - 如何在不返回值的情况下显示消息
- c - C -Wformat 警告 printf 中的整数提升
- javascript - 如何打破 querySnapshot forEach 循环方法?
- python - 将图像添加到 Tkinter 中的按钮
- java - Aws AuthenticationHandler
- swift - 如何在两个文本字段中至少包含一个字符之前禁用按钮?
- python - 尽管设置了超时,但 Python 请求发布超时
- excel - 如何在不使用 VBA 中的自定义类的情况下构建最小的 Excel-VBA 链接列表
- android - Flutterfire firebase_auth 不再起作用