你应该如何处理嵌套函数?
How should you handle nested functions?
在 PowerShell 中调用函数的正确方法是什么?
示例 1:
Function Divide
{
Return ($a / $b)
}
Function GetNumbers
{
$a = Read-Host "Dividend"
$b = Read-Host "Divisor"
Divide
}
GetNumbers
示例 2:
Function Divide
{
Param
(
[Int]$Dividend,
[Int]$Divisor
)
Return ($Dividend / $Divisor)
}
Function GetNumbers
{
$a = Read-Host "Dividend"
$b = Read-Host "Divisor"
Divide -Dividend $a -Divisor $b
}
GetNumbers
我的意思是,当我可以访问父函数的变量时,为什么还要使用 Param
部分?或者这只是糟糕的编程?
第一个示例的问题在于,您的 Divide
函数只有在恰好位于 GetNumbers
函数内部时才会起作用。如果您尝试在 GetNumbers
之外调用它,您将引发错误,因为 $a
和 $b
将是未定义的:
PS > Divide
Attempted to divide by zero.
At line:3 char:12
+ Return ($a / $b)
+ ~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
这意味着您的 Divide
函数的用例非常有限,而且有些不直观。人们可能会认为它会工作(因为它在模块级别)调用该函数,并对结果感到惊讶。
第二个例子中的Divide
函数没有这个问题。它独立于 GetNumbers
函数,可以在普通函数可以使用的任何地方使用。这具有三个优点:
Divide
表现得像一个模块级函数,这意味着您的用户不会遇到令人讨厌的意外。
Divide
的用例已大大增强。您现在可以在任何需要的地方划分两个数字。
您的代码更健壮。 Divide
不需要在刚 发生 的函数中定义两个名为 $a
和 $b
的变量,它们只是 发生 成为数字(看看第一个例子有多脆弱?)。
另请注意,您无需在第二个示例中明确给出参数名称。你可以这样做:
Divide $a $b
如果您不喜欢第二个 Divide
函数的大小,您总是可以让 Param
语句不那么分散:
Function Divide
{
Param ([Int]$Dividend, [Int]$Divisor)
Return ($Dividend / $Divisor)
}
在 PowerShell 中调用函数的正确方法是什么?
示例 1:
Function Divide
{
Return ($a / $b)
}
Function GetNumbers
{
$a = Read-Host "Dividend"
$b = Read-Host "Divisor"
Divide
}
GetNumbers
示例 2:
Function Divide
{
Param
(
[Int]$Dividend,
[Int]$Divisor
)
Return ($Dividend / $Divisor)
}
Function GetNumbers
{
$a = Read-Host "Dividend"
$b = Read-Host "Divisor"
Divide -Dividend $a -Divisor $b
}
GetNumbers
我的意思是,当我可以访问父函数的变量时,为什么还要使用 Param
部分?或者这只是糟糕的编程?
第一个示例的问题在于,您的 Divide
函数只有在恰好位于 GetNumbers
函数内部时才会起作用。如果您尝试在 GetNumbers
之外调用它,您将引发错误,因为 $a
和 $b
将是未定义的:
PS > Divide Attempted to divide by zero. At line:3 char:12 + Return ($a / $b) + ~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException
这意味着您的 Divide
函数的用例非常有限,而且有些不直观。人们可能会认为它会工作(因为它在模块级别)调用该函数,并对结果感到惊讶。
第二个例子中的Divide
函数没有这个问题。它独立于 GetNumbers
函数,可以在普通函数可以使用的任何地方使用。这具有三个优点:
Divide
表现得像一个模块级函数,这意味着您的用户不会遇到令人讨厌的意外。Divide
的用例已大大增强。您现在可以在任何需要的地方划分两个数字。您的代码更健壮。
Divide
不需要在刚 发生 的函数中定义两个名为$a
和$b
的变量,它们只是 发生 成为数字(看看第一个例子有多脆弱?)。
另请注意,您无需在第二个示例中明确给出参数名称。你可以这样做:
Divide $a $b
如果您不喜欢第二个 Divide
函数的大小,您总是可以让 Param
语句不那么分散:
Function Divide
{
Param ([Int]$Dividend, [Int]$Divisor)
Return ($Dividend / $Divisor)
}