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

时间:2015-01-13 15:38:26

标签: function powershell

在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部分?或者这只是糟糕的编程?

1 个答案:

答案 0 :(得分:1)

第一个示例的问题是,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的变量,这些变量只是发生到是数字(看第一个例子有多脆弱?)。


  4. 另请注意,您不需要在第二个示例中明确指定参数名称。你可以这么做:

    Divide $a $b
    

    如果您不喜欢第二个Divide函数的大小,您可以随时将Param语句分散开来:

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