关于PowerShell的一个可悲的事情是函数和脚本块是动态作用域的。
但另一件让我惊讶的事情是,变量在内部作用域中的行为就像写时复制。
$array=@("g")
function foo()
{
$array += "h"
Write-Host $array
}
& {
$array +="s"
Write-Host $array
}
foo
Write-Host $array
输出为:
g s
g h
g
这使得动态作用域不那么痛苦。但是我如何避免写时复制呢?
发布于 2019-08-17 21:32:38
虽然其他帖子提供了许多有用的信息,但它们似乎只是为了让你免于使用RTFM。
没有提到的答案是我发现的最有用的答案!
([ref]$var).value = 'x'
这将修改$var的值,无论它恰好在什么作用域中。您不需要知道它的作用域;只需要知道它实际上已经存在。使用OP的示例:
$array=@("g")
function foo()
{
([ref]$array).Value += "h"
Write-Host $array
}
& {
([ref]$array).Value +="s"
Write-Host $array
}
foo
Write-Host $array
产生:
g s
g s h
g s h
解释:
(ref$var)获取指向变量的指针。因为这是一个读操作,所以它解析到实际创建该名称的最新作用域。它还解释了变量不存在时的错误,因为ref不能创建任何东西,它只能返回对已经存在的东西的引用。
然后,.value将您带到保存变量定义的属性;然后您可以设置该属性。
您可能会想做这样的事情,因为它有时看起来很有效。
([ref]$var) = "New Value"
不要!
它看起来可以工作的实例是一种错觉,因为PowerShell正在做的事情只在一些非常有限的情况下才能做,比如在命令行上。你不能指望它。事实上,它在OP示例中不起作用。
https://stackoverflow.com/questions/9325569
复制相似问题