请考虑这个愚蠢的例子:
if (1..3) { "true" }
以上产生输出true。
我的问题: if 语句如何处理这样的情况,其中条件输出多个值?“真”输出是“3”(最后一种情况)的结果吗?还是其他一些逻辑在起作用?谢谢。
请考虑这个愚蠢的例子:
if (1..3) { "true" }
以上产生输出true。
我的问题: if 语句如何处理这样的情况,其中条件输出多个值?“真”输出是“3”(最后一种情况)的结果吗?还是其他一些逻辑在起作用?谢谢。
观察到的行为在此博客文章中(在某种程度上)进行了解释。基本上,如果一个表达式的计算结果为 0,则它被解释为假,否则为真。例子:
0 => False
1 => True
"0" => True (because it's a string of length 1)
"" => False (because it's a string of length 0)
@() => False
@(0) => False (this one's a little surprising)
@(0,1) => True
@("0") => True
正如预期的那样,上面的输出为真。
为什么你期望它输出“真”?
if 语句如何处理条件输出多个值的这种情况?
条件不“输出”任何值。它总是评估为“真”或“假”。剩下的问题是,为什么它评估为真(或假)。
编码
if (1..3) { "true" }
等于
if (@(1,2,3)) { "true" }
等于
$array = @(1,2,3)
if ($array) { "true" }
表现为
if ($array.Length -gt 0) { "true" }
因此,不会测试单个元素,而是测试数组是否包含任何元素。
例如,以下内容不会打印“true”:
if (@()) { "true" }
更新如果数组只包含一个值,它看起来(我找不到任何规范文档),就好像数组被视为使用里面的一个元素的标量值。
所以
if (@(0))
if (@(0.0))
if (@(1))
if (@(-1))
if (,$null))
if (,"false"))
被视为
if (0) --> false
if (0.0) --> false
if (1) --> true
if (-1) --> true
if ($null) --> false
if ("false") --> true
1..3 生成一个包含 3 个项目的数组
PS> (1..3).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> (1..3).Length
3
如果数组中至少有一项,则 if 认为它是真的
PS> if (@()) { "true" } else { "false" }
false
PS> if (@(1)) { "true" } else { "false" }
true
PS> if (@(1,2)) { "true" } else { "false" }
true