代码之家  ›  专栏  ›  技术社区  ›  alex2k8

如何省略调用函数的$null参数?

  •  1
  • alex2k8  · 技术社区  · 15 年前

    考虑这样的功能:

    $missed = "{716C1AD7-0DA6-45e6-854E-4B466508EB96}"
    
    function Test($foo = $missed, $bar = $missed)
    {
      if(!$foo)
      {
        throw "error"
      }
    
      if(!$bar)
      {
        throw "error"
      }
    }
    

    我想用这种方式调用这个函数

    Test -foo $foo -bar $bar
    

    但如果$foo或$bar为$null,则将引发异常。天真的解决办法是

    if($foo -and $bar)
    {
      Test -foo $foo -bar $bar
    }
    elseif ($foo)
    {
      Test -foo $foo
    }
    elseif ($bar)
    {
      Test -bar $bar
    }
    else
    {
      Test
    }
    

    如何将if/else块重写为一行或两行?

    4 回复  |  直到 12 年前
        1
  •  3
  •   JasonMArcher TWE    15 年前

    由于您无法控制测试功能,因此可以执行以下操作:

    $params = @()
    if ($foo) {
        $params += "-Foo","`$foo"
    }
    if ($bar) {
        $params += "-Bar","`$bar"
    }
    Invoke-Expression "Test $params"
    
        2
  •  2
  •   dan-gph    15 年前
    function m ($x) {if ($x) {$x} else {$missed}}
    
    Test -foo (m $foo) -bar (m $bar)
    
        3
  •  1
  •   Mohit Chakraborty    15 年前

    你可以把函数写为-

    如果(!)$foo)$foo=错过$foo
    如果(!)$bar)$bar=$错过

        4
  •  1
  •   Paul Moore    12 年前

    您可以使用“喷溅”如下:

    $params = @{}
    if ($foo) {$params['foo'] = $foo}
    if ($bar) {$params['bar'] = $bar}
    Test @params
    

    它不会短很多,但它是一个通常有用的技巧。