gpt4 book ai didi

Powershell lambda 作用域

转载 作者:行者123 更新时间:2023-12-03 00:32:05 25 4
gpt4 key购买 nike

我正在尝试使用高阶函数来执行某项任务,但范围似乎没有按我预期的那样工作。代码如下:

function DoSomething($scriptBlock, $message) {

# if not only running a check, run the given code
if ($shouldRunCheck) {
return $scriptBlock.Invoke()
}

Write-Host $message -foreground cyan
# write $message to file
}

这似乎工作正常,但当我调用它时,我似乎无法保存到脚本 block 之外的变量。

$myArray = @()
$myArray += 'test 1'

DoSomething {
write-host $myArray # test 1
$myArray += 'test 2'

write-host $myArray # test 2
}

write-host $myArray # test 1
$myArray += 'test 3'
write-host $myArray # test 1 test 3

本质上,我需要从回调函数中添加到数组变量,但它似乎覆盖了变量,就好像变量是只读的一样?

最佳答案

+1 @Theo解释,尽管我会尽量避免使用 $Global:$Script: 范围,因为它们可能会让人感到困惑。
也可以使用 ([Ref]$myArray).Value 来引用调用者的当前范围:

function DoSomething($scriptBlock) {
return $scriptBlock.Invoke()
}

$myArray = @('test 1')
$scriptBlock = {
([Ref]$myArray).Value += 'test 2'
}

DoSomething $scriptBlock

$myArray += 'test 3'
Write-Host $myArray
test 1 test 2 test 3

但是来自Theo的解释还暗示在 PowerShell 数组上使用 += 不是一个好主意,因为您每次都将重新创建数组,这很慢。

换句话说,为了获得更好的性能,最好使用 ArrayListAdd 方法而不是分配项目:

function DoSomething($scriptBlock) {
return $scriptBlock.Invoke()
}

$myArray = New-Object System.Collections.ArrayList
$myArray.Add('test 1')
$scriptBlock = {
$myArray.Add('test 2')
}

DoSomething $scriptBlock

$myArray.Add('test 3')
Write-Host $myArray
test 1 test 2 test 3

您还可以考虑使用强大的 PowerShell 管道来执行以下操作:

$scriptBlock = {
'test 2'
}

$myArray = @(
'test 1'
DoSomething $scriptBlock
'test 3'
)
Write-Host $myArray
test 1 test 2 test 3

关于Powershell lambda 作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59598933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com