奇怪的合并行为

20 浏览
0 Comments

奇怪的合并行为

最近我在寻找在PowerShell中实现空值合并的方法,然后我遇到了这篇文章:Null coalescing in powershell

我看到了@Zenexer的评论,觉得很有意思。这是语法:

Clear-Host
#预期为one
"测试1:" + ("one", "two", 1 -ne $null)[0]
#预期为two
"测试2:" + ($null, "two", 1 -ne $null)[0]

这个方法运行得很完美。然而,我和同事Walter Puckett对这个语法非常感兴趣,我们进一步研究了一些奇怪的现象。

在我讲述这些奇怪的现象之前,有人能指出一些解释这个语法的文档吗?

## 奇怪的现象:
# 显然,数字并不重要
"测试3:" + ($null, "two", 8675309 -ne $null)[0]
# 反转比较测试会破坏合并
"测试4:" + ($null, "two", $null -ne 1)[0]
# 把测试放在数组中间会导致数组被截断
"测试5:" + ($null, 1 -ne $null, "two").Length
# 把测试放在数组中间会导致数组被截断,
# 除非你用括号包裹测试
"测试6:" + ($null, (1 -ne $null), "two").Length
# 测试中使用的数字会作为数组中该索引位置的值返回
"测试7:" + ($null, $null, 8675309 -ne $null)[0]
# 测试中使用的数字会作为数组中该索引位置的值返回,
# 除非你用括号包裹测试
"测试8:" + ($null, $null, (8675309 -ne $null))[0]
# 用括号包裹测试会破坏合并
"测试9:" + ($null, "two", (1 -ne $null))[0]
# 如果所有元素都为null,则默认值将是测试左侧的值
"测试10:" + ($null, $null, 123456789 -ne $null)[0]
# 使用对象进行测试
$conn = New-Object System.Data.SqlClient.SqlConnection     
"测试11:" + ($null, $conn, 1 -ne $null)[0].GetType()

所得教训:

  • 测试应该放在数组的最后一个元素
  • 测试不应该用括号包裹,因为这会破坏合并
  • 默认值必须在测试的左侧,或者作为数组中倒数第二个项硬编码
  • 我们测试了数字和简单对象,所以它应该适用于任何类型的对象
0
0 Comments

奇怪的合并行为是由于以下原因引起的:

- 必须使用-ne $null作为过滤器

- 过滤器必须应用于整个数组

只有这样,索引[0]才会返回输入数组中的第一个非空元素。

解决方法:

- 使用-ne $null作为过滤器

- 将过滤器应用于整个数组

此外,将比较测试放在数组的中间会导致数组被截断,这是因为-ne不支持与数组有意义的匹配。

其他测试都是以上述原因的变化。

PowerShell中的运算符优先级很复杂,特别是因为有很多运算符,包括数组构造运算符,

0