我从互联网上得到了下面的脚本:
$private:a = 1
Function test {
"variable a contains $a"
$a = 2
"variable a contains $a"
}
test
它打印2。没问题。如果我删除"private",如下所示:
$a = 1
Function test {
"variable a contains $a"
$a = 2
"variable a contains $a"
}
它仍然打印"2“。似乎没什么不同。您能提供一个“私有”作用域如何影响结果的快速示例吗?
谢谢。
发布于 2016-04-01 17:26:20
当编写调用用户提供的回调的函数时,私有作用域可能很有用。考虑这个简单的例子:
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) {
$_
}
}
现在,Where-Name
中的$FirstName
在从$FirstName
脚本块引用时不会在外部作用域中隐藏$Condition
。
发布于 2017-06-10 05:42:15
好的软件设计意味着最小化耦合(以及其他事情)。在Powershell中,这包括尽可能地对每个变量使用private。如果要使某个值在随后调用的模块中可用,请显式传递该信息。不这样做应该有一个非常好的例外原因,因为每次你依赖于隐式知识(例如,当你不使用私有变量时在Powershell中发生的那种),你增加了以后出现意外错误的可能性(可能几个月后,当软件中有更多的代码时)。
https://stackoverflow.com/questions/36346817
复制相似问题