gpt4 book ai didi

arrays - 为什么在创建数组时需要逗号前导?

转载 作者:行者123 更新时间:2023-12-04 05:16:42 26 4
gpt4 key购买 nike

我想创建一个包含两个数字的数组的数组。非常简单。但是,如果我没有在第一个数组前提供前导逗号,那是不正确的。为什么需要此前导逗号?

PS C:\src\powershell> Get-Content .\fr-btest.ps1
$files1 = @(
@(4, 1024)
, @((7), (16))
)

$files1
$files1.GetType()
$files1.Length
$files1.Count
'========'

$files2 = @(
, @(4, 1024)
, @((7), (16))
)

$files2
$files2.GetType()
$files2.Length
$files2.Count

PS C:\src\powershell> .\fr-btest.ps1
4
1024
7
16

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
3
3
========
4
1024
7
16
True True Object[] System.Array
2
2

最佳答案

@()array subexpression operator,其工作方式与您可能习惯于其他语言的数组构造运算符不同。运算符计算嵌套的子表达式,并将该表达式的输出作为数组返回。意味着您可以执行以下操作:

@(
Write-Output 'foo'
Get-Content 'C:\some\file.txt'
Test-Connection '192.168.23.42' -Count 1
)

并有一个数组出来。

对于第一个示例,这意味着分别对两个语句 @(4, 1024), @((7), (16))求值,然后将两个语句的集合输出作为数组返回。

第一条语句( @(4, 1024))输出两个整数,但是第二条语句( , @((7), (16)))输出两个整数的数组。这是因为该语句中的前导逗号被解释为一元数组构造运算符(或逗号运算符),因此您将嵌套一个数组嵌套在另一个数组中,并且在输出期间仅展开外部数组。

本质上,您的表达与
$files1 = @(
4
1024
, @(7, 16)
)

或者
$files1 = 4, 1024, @(7, 16)

您的第二个示例避免了这种陷阱,因为两个嵌套数组都以一元数组构造运算符为前缀,因此可以防止它们被完全展开。

话虽如此,我建议以更明确的方式定义数组,例如像这样:
$files1 = @(4, 1024),
@(7, 16)

或(使用分组表达式而不是数组子表达式),如下所示:
$files1 = (4, 1024),
(7, 16)

避免像您观察到的那样的意外。此处不需要外部 @()来定义数组。 PowerShell通过第一行末尾的逗号自动检测到该错误。

有关更多信息,请参见 about_Operators

关于arrays - 为什么在创建数组时需要逗号前导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42772083/

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