【问题标题】:PowerShell: an elegant way to create closuresPowerShell:一种创建闭包的优雅方式
【发布时间】:2009-12-02 10:17:47
【问题描述】:

Keith Hill 向我解释了 blocks in PowerShell are not closures 并且要从块中创建闭包,我必须调用方法 .GetNewClosure()

有没有什么优雅的方法可以从块中创建闭包? (例如,创建一个包装函数,一个别名?,...)

例子:

{ block }
${ closure } # ???

【问题讨论】:

    标签: .net powershell closures


    【解决方案1】:

    您可以创建一个接受脚本块、调用 GetNewClosure 并返回闭包的函数。您必须使用点运算符调用此函数,例如:

    function =>([scriptblock]$_sb_)
    {
        $_sb_.GetNewClosure()
    }
    
    function A($block) 
    {
        B (. => {Write-Host 2; &$block})
    }
    
    function B($block) {Write-Host 1;&$block}
    
    A {Write-Host 3}
    

    不确定这是否比仅在脚本块上调用 GetNewClosure() 好得多。请注意,您可以为该函数选择其他名称。我想要一些更像 C# lambdas 的东西。

    【讨论】:

    • 谢谢。为什么我需要使用点运算符来调用函数? (要获得相同的上下文?)
    • 是的,所以函数在调用它的同一范围内执行。
    • Keith,我们真的需要打败 bruce 和 jeffrey 才能想出更自然的语法。我讨厌 GetNewClosure() 方法。这太笨拙了。我在考虑使用双括号: {{ $ix }} ?
    • 请不要{{...}}。这是一个返回脚本块的脚本块。这是一个有效的场景。我在实践中使用它。
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多