考虑以下因素: (注意:为了便于阅读,我稍微修改了输出)
~> @(11..20)
11, 12, 13, 14, 15, 16, 17, 18, 19, 20
~> @(11..20+1)
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1
~> @(1+11..20)
InvalidOperation: Method invocation failed because [System.Object[]] does not contain a method named 'op_Addition'.
我一直发现这种数组加法语法令人困惑,并且更喜欢像 @(1,11..20)
这样的语法。
无论如何,为什么第三个操作与第二个操作的工作方式不同?
是否因为 1
不被视为数组,即使它是作为数组定义语法的一部分给出的?
~> @(1,2+11..20)
1, 2, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
如果是这样的话,为什么 @(11..20+1)
会按预期工作?
我可以通过几种方式解决这个问题......
~> @(@(1)+11..20)
1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
~> @(,1+11..20)
1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
~> @(11..20+1) | Sort
1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
但是这些看起来相当丑陋、不优雅,并且后一种解决方法并没有考虑到我实际上不想对数组进行排序的情况。
最有意义的是@(,1+11..20)
,尽管它不是特别令人愉快。是否有更合适的方法可以按所需的顺序实现所需的结果,而无需额外的语法或管道?
official documentation 中没有任何示例演示这种特定的排列。
谢谢。
最佳答案
@(...)
,PowerShell 的数组子表达式运算符 - 枚举任何 ...
输出并将其收集在 [object[]]
数组中 - 仅适用在 ...
被评估之后,所以我们可以在本次讨论中将其放在一边。
通常,在 PowerShell 中,操作的 LHS 类型决定了应用哪种适合类型的操作重载。
在
11..20 + 1
中,LHS 是一个数组,因为使用了..
, the range operator ,因此+
运算符执行数组连接。在
1 + 11..20
中,LHS 是一个标量 - 一个[int]
实例 - 因此+
运算符尝试执行数字加法,但是失败了,因为将数组添加到数字没有意义,因此是'支持。
如果您想使用标量 LHS 执行数组串联,请将该LHS 包装在aux 中。数组使用,
的一元形式,array constructor operator :
, 1 + 11..20
或者,使用以下选项之一:
@(1) + 11..20
[数组] 1 + 11..20
如果您事先不知道 LHS 实际上是否是 已经是一个数组,但您希望它在不是数组的情况下将其视为数组,则 [array]
cast 是最有效的解决方案:
[array] 1 + 11..20
请注意,基于 PowerShell 的 operator precedence rules,转换仅适用于 1
.
关于arrays - 了解晦涩的 PowerShell 数组语法 : Why does @(11. .20+1) 有效,而 @(1+11..20) 无效?我怎样才能实现后者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71280835/