Julia创建一个函数的多个稍微修改的版本

问题描述 投票:1回答:1

我有一个看起来像的功能

function eom!(du, u, p)
    @views a, b = u[:,1], u[:,2];
    @views da, db = du[:,1], du[:,2];

    y = # some stuff involving p and a;
    da .= f(a, b, y);
    db .= g(b, a);
end

我现在想再创建一个功能完全相同的函数,除了最后一行读取的内容

db .= g(b, y);

我该如何做到最干净?当然,我可以复制和粘贴函数,并给它们取稍有不同的名称,但这似乎是不理想的,特别是在合理的情况下,如果以后我想要更多的函数,而g的第二个参数可能是其他的话。也许有一种方法可以将指定eom!的第二个参数的表达式(通过参数p)传递到函数g中?还是有办法使某些函数eom_generator可以输出我想要的所有函数?也许宏是执行此操作的主要工具,但我不确定。

function macros closures julia metaprogramming
1个回答
4
投票

您可以产生一个闭包:

function eom_generator(g)
    return function eom!(du, u, p)
        @views a, b = u[:,1], u[:,2]
        @views da, db = du[:,1], du[:,2]

        y = nothing # some stuff involving p and a;
        da .= f(a, b, y)
        db .= g(a, b, y)
    end
end

const eom1! = eom_generator((a, b, y) -> g(b, a))
const eom2! = eom_generator((a, b, y) -> g(b, y))

但是因为这是微分方程式的核心,所以一定要测试一下那样是否没有性能问题。

© www.soinside.com 2019 - 2024. All rights reserved.