【问题标题】:Difference between $true and $false under the hood$true 和 $false 之间的区别
【发布时间】:2018-03-06 00:37:23
【问题描述】:

所以我玩了一下 PowerShell,在下面的代码中发现了一个有点令人惊讶的结果

function returns_true(){
    return $true
}

function returns_false(){
    return $false
}

if (returns_true -eq $true){
    Write-Host "I return true"
}

if (returns_false -eq $false){
    Write-Host "I return false"
}
$myval = returns_false
Write-Host $myval

运行它会给我以下输出

I return true
False

我期待这会返回

I return true
I return false
False

或者只是

False

有人能解释一下这里发生了什么吗?当我返回$true$false 时,PowerAhell 到底在做什么让我可以评估-eq $true,但不能评估-eq $false

【问题讨论】:

    标签: powershell boolean


    【解决方案1】:

    这里实际发生的是解析器将 -eq $true 和 -eq $false 作为参数传递给函数。

    要查看这种情况,请将 [CmdletBinding()]Param() 添加到如下函数中:

    function returns_true(){
    [CmdletBinding()]
    Param()
        return $true
    }
    

    【讨论】:

    • 谢谢,我在测试时发现了其他一些令人惊讶的结果,但在你解释之后,它们现在都有意义了!
    • 另一种验证意外行为的方法:将正文更改为$args,它将分别返回-eq$true
    • @FrodeF.- 好点。我试图敦促人们几乎总是使用 CmdletBinding(),所以这通常是我的首选。
    【解决方案2】:

    更好地解释发生了什么: https://stackoverflow.com/a/49115149/9446818

    括号帮助。你真正想要的是:

    if ((returns_true) -eq $true){
    

    if ((returns_false) -eq $false){
    

    【讨论】:

    • 为什么?因为函数名称周围的( ) 指示解析器您希望它们作为表达式求值。
    • Parens 使它“工作”,但从代码中看不出为什么会这样。我喜欢理解解析模式,但我建议使用 CmdletBinding(),这清楚地表明 -eq 被视为参数。
    猜你喜欢
    • 2016-12-02
    • 2012-08-23
    • 2019-12-12
    • 2010-10-11
    • 2020-12-13
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多