首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Powershell "private“作用域似乎一点用处都没有。

Powershell "private“作用域似乎一点用处都没有。
EN

Stack Overflow用户
提问于 2016-04-01 10:01:24
回答 2查看 5.7K关注 0票数 7

我从互联网上得到了下面的脚本:

代码语言:javascript
复制
$private:a = 1
Function test  {
    "variable a contains $a"
    $a = 2
    "variable a contains $a"
}
test

它打印2。没问题。如果我删除"private",如下所示:

代码语言:javascript
复制
$a = 1
Function test  {
    "variable a contains $a"
    $a = 2
    "variable a contains $a"
}

它仍然打印"2“。似乎没什么不同。您能提供一个“私有”作用域如何影响结果的快速示例吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-01 17:26:20

当编写调用用户提供的回调的函数时,私有作用域可能很有用。考虑这个简单的例子:

代码语言:javascript
复制
filter Where-Name {
    param(
        [ScriptBlock]$Condition
    )
    $FirstName, $LastName = $_ -split ' '
    if(&$Condition $FirstName $LastName) {
        $_
    }
}

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

代码语言:javascript
复制
$FirstName = 'First2'
'First1 Last1', 'First2 Last2', 'First3 Last3' |
  Where-Name {param($a, $b) $a -eq $FirstName}

他们期望看到的只是First2 Last2行,但实际上这将打印所有三行。这是因为$FirstName变量上的冲突。为了防止这种冲突,您可以在Where-Name中将变量声明为私有:

代码语言:javascript
复制
filter Where-Name {
    param(
        [ScriptBlock]$private:Condition
    )
    $private:FirstName, $private:LastName = $_ -split ' '
    if(&$Condition $FirstName $LastName) {
        $_
    }
}

现在,Where-Name中的$FirstName在从$FirstName脚本块引用时不会在外部作用域中隐藏$Condition

票数 12
EN

Stack Overflow用户

发布于 2017-06-10 05:42:15

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36346817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档