Powershell“私人”范围似乎毫无用处?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

我从下面得到了以下脚本:

$private:a = 1
Function test  {
    "variable a contains $a"
    $a = 2
    "variable a contains $a"
}
test

打印2.没问题。如果我删除“私人”,如下所示:

$a = 1
Function test  {
    "variable a contains $a"
    $a = 2
    "variable a contains $a"
}

它还打印“2”。似乎没有区别。您能否快速提供“私人”范围如何影响结果的样本?

谢谢。

提问于
用户回答回答于

在编写调用用户提供的回调函数时,私有作用域非常有用。考虑这个简单的例子:

filter Where-Name {
    param(
        [ScriptBlock]$Condition
    )
    $FirstName, $LastName = $_ -split ' '
    if(&$Condition $FirstName $LastName) {
        $_
    }
}

然后,如果有人这样称呼它:

$FirstName = 'First2'
'First1 Last1', 'First2 Last2', 'First3 Last3' |
  Where-Name {param($a, $b) $a -eq $FirstName}

他们期望只能看到First2 Last2行,但实际上这将打印所有三行。这是因为$FirstName变量发生碰撞。要防止此类冲突,您可以将变量声明Where-Name为私有:

filter Where-Name {
    param(
        [ScriptBlock]$private:Condition
    )
    $private:FirstName, $private:LastName = $_ -split ' '
    if(&$Condition $FirstName $LastName) {
        $_
    }
}

现在,$FirstNameWhere-Name不隐藏$FirstName在引用时在外部范围$Condition脚本块。

用户回答回答于

良好的软件设计意味着最小化耦合(以及其他事项)。在Powershell中,包括使用私有ON每个变量你可以。如果要在某个后续调用的模块中提供值,请明确传递该信息。应该有一个非常好的EXCEPTION原因不这样做,因为每次你依赖隐式知识(例如,当你不使用私有变量时在Powershell中发生的那种),你增加了以后出现意外错误的机会(也许几个月后软件中有更多的代码)。

扫码关注云+社区

领取腾讯云代金券