当前位置: 首页 > 知识库问答 >
问题:

奇怪的联合行为

商昆琦
2023-03-14

好的,最近我在寻找一种在PowerShell中实现空合并的方法,我遇到了这篇文章:在PowerShells中实现空聚合。

我看到了@Zenexer的评论,很感兴趣。语法如下:

Clear-Host
#expected one
"Test 1: " + ("one", "two", 1 -ne $null)[0]
#expected two
"Test 2: " + ($null, "two", 1 -ne $null)[0]

这非常有效。然而,我的一位同事(沃尔特·帕克特)和我非常感兴趣,对语法做了更多的挖掘,发现了一些真正的奇怪之处。

在我进入怪异之前,任何人都可以指出任何解释这种语法的文档吗?

## THE WEIRDNESS:

# it does not matter what the number is evidently
"Test 3: " + ($null, "two", 8675309 -ne $null)[0]

# reversing the comparison test breaks the coalesce
"Test 4: " + ($null, "two", $null -ne 1)[0]

# Moving the test into the middle of the array evidently cuts the array off
"Test 5: " + ($null, 1 -ne $null, "two").Length

# Moving the test into the middle of the array evidently cuts the array off,
# UNLESS you wrap the test with parens
"Test 6: " + ($null, (1 -ne $null), "two").Length

# The number used in the test is returned for the array value at that index
"Test 7: " + ($null, $null, 8675309 -ne $null)[0]

# The number used in the test is returned for the array value at that index,
# UNLESS you wrap the test with parens
"Test 8: " + ($null, $null, (8675309 -ne $null))[0]

# wrapping the test with parens will break the coalesce
"Test 9: " + ($null, "two", (1 -ne $null))[0]

# if all elements are null, the default value will be the value on the left
# side of the test
"Test 10: " + ($null, $null, 123456789 -ne $null)[0]

# test with an object
$conn = New-Object System.Data.SqlClient.SqlConnection     
"Test 11: " + ($null, $conn, 1 -ne $null)[0].GetType()

经验教训:

    < li >测试应该进入数组的最后一个元素 < li >测试不应该用聚结物包裹,因为这样会破坏聚结物 < li >默认值必须在测试的左侧,或者硬编码为数组中的倒数第二项 < li >我们用数字和一个简单的html" target="_blank">对象测试进行了测试,因此它应该适用于任何类型的对象

共有1个答案

蒋正平
2023-03-14

这里有两个主要感兴趣的文档主题:

>

  • about_Arrays

    about_Comparison_Operators

    简而言之,对于空合并,您的工作方法:

    > < li>

    -ne $null必须用作过滤器

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

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

    由于它可能不明显,让我指出,正如about_Operator_Precedence所记录的那样:

    $null, 2, 3 -ne $null # returns array without $nulls: 2, 3
    

    被解析为:

    ($null, 2, 3) -ne $null
    

    显然,数字是多少并不重要。

    "测试3:"($null,"二",8675309-ne$null)[0]

    测试 3 按预期方式工作:-ne $null筛选出$null元素,因此索引 0 访问第一个非空元素。

    反转比较测试会破坏合并

    "测试4:"($null,"二",$null-ne 1)[0]

    -网元1返回不是1的所有元素,其中包括$null;因此访问索引0在这里返回$null

    将测试移到数组的中间显然会切断数组

    "测试5:"($null,1-ne$null,"Two")。长度

    $null,1 -ne $null,“两”与:($null,1)-ne($null,“二”)相同,并产生$null,1,即未修饰的LHS。这是因为 -ne 与任何 LHS 元素都不匹配,因为 RHS 是一个数组,这没有得到有意义的支持。[注1]

    所有其他测试都只是上述测试的变体。

    <sup>[1]所发生的事情-模糊地-是在比较之前对a RHS数组进行字符串化,从而仅过滤与字符串化数组匹配的LHS元素;e、 例如,'1 2',3-ne 1,2产生@(3),因为“$(1,2)”产生值为1 2的字符串,该字符串与第一个LHS元素匹配。

  •  类似资料:
    • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

    • 将< code>dplyr::arrange与< code>gtools::mixedorder一起使用时,我注意到了一个意外的结果。 考虑: 在test2中,第1列排序: 而在test3中,列的排序与使用gtools:mixedorder时预期的一样 为什么当我组合排列和混合工具时会发生这种情况?这是一个错误吗? 非常感谢,安妮克

    • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

    • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

    • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。

    • 问题内容: 我认为这是一个正常程序,但这是我得到的输出: 有人可以向我解释一下吗? 问题答案: 这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。 警告 即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __ 编辑 尝试逐步了解此处实际发生的情况