你应该如何处理嵌套函数?

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 函数,可以在普通函数可以使用的任何地方使用。这具有三个优点:

  1. Divide 表现得像一个模块级函数,这意味着您的用户不会遇到令人讨厌的意外。

  2. Divide 的用例已大大增强。您现在可以在任何需要的地方划分两个数字。

  3. 您的代码更健壮。 Divide 不需要在刚 发生 的函数中定义两个名为 $a$b 的变量,它们只是 发生 成为数字(看看第一个例子有多脆弱?)。


另请注意,您无需在第二个示例中明确给出参数名称。你可以这样做:

Divide $a $b

如果您不喜欢第二个 Divide 函数的大小,您总是可以让 Param 语句不那么分散:

Function Divide
{
    Param ([Int]$Dividend, [Int]$Divisor)

    Return ($Dividend / $Divisor)
}