【问题标题】:Trying to get higher order functions to work in powershell试图让高阶函数在powershell中工作
【发布时间】:2013-07-09 03:57:01
【问题描述】:

我无法让这个例子工作

{ $_ + $_ }, { $_ + 1}, {$_ - 1} | % { $_ 1 }

我希望它构造一个列表/数组/集合/任何函数(这部分很好),然后将该列表通过管道传输到右侧的代码块,它将每个函数应用于参数 1 并返回带有结果的数组(即;2,2,0)。我已经尝试使用 getnewclosure() 方法、& 运算符,到目前为止没有任何效果。

【问题讨论】:

    标签: powershell functional-programming closures higher-order-functions


    【解决方案1】:

    美元下划线变量是一个自动变量,仅在某些情况下才会填充;在这种情况下,当有来自管道的传入对象时。为了将$_ 的值设为 1,这似乎是您的意图,您必须将数字传递给每个,并执行脚本块。最简单的方法是将其作为参数直接传递给接受脚本块的% (foreach-object):

    PS> { $_ + $_ }, { $_ + 1}, {$_ - 1} | % { 1 | % $_ }
    2
    2
    0
    

    看看它直到它有意义:) 如果它没有点击,请在这里评论,我会更详细地解释。

    如果您对 powershell 中的功能修补感兴趣,您可能会喜欢我为部分应用编写的这个功能:

    http://www.nivot.org/blog/post/2010/03/11/PowerShell20PartialApplicationOfFunctionsAndCmdlets

    这有点笨拙,但仍然可以。

    【讨论】:

      【解决方案2】:

      我想建议稍微不同的方法:使用另一个自动变量而不是 $_,以便使用传递的值 (1):

      { $args[0] + $args[0] }, { $args[0] + 1 },  { $args[0] - 1 } | % { & $_ 1 }
      

      正如 Oisin 所说,$_ 不用于:& { $_ } 1 场景,它仅在涉及管道时才有效。

      【讨论】:

      • 哦,我假设 $_ 总是作用于当前块。这样做实际上会有所作为。哈哈不错
      • 我考虑过这一点,但我认为使用$_ 更简洁。如果你要走$args[0] 路线,使用显式param($x) 可能会更简洁。
      猜你喜欢
      • 2020-03-22
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多