function - Julia 创建一个函数的多个稍作修改的版本
问题描述
我有一个看起来像的功能
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 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))
但由于这是微分方程的核心,因此请务必测试您是否没有任何性能问题。
如果您决定确实需要元编程,则可以@eval
在循环中使用:
for (i, expr) in enumerate((:(g(b, a)), :(g(b, y))))
@eval function $(Symbol("eom", i, "!"))(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 .= $expr
end
end
end
推荐阅读
- php - 即使成功后,ajax成功调用执行else条件
- python - 使用马尔可夫链将RGB图像转换为黑白(0-1)
- javascript - 如何以角度传递 Javascript 变量(JSON 数据)以在表中加载动态数据
- asp.net-core - .Net5 vs .Net Core 3 我应该选择哪一个作为目标
- xml - 增加 Tab 和 TabLayout 之间的间隙
- c# - 将“MM/yy”转换为日期时间c#
- ios - 日期格式无法正常工作 - 字符串到日期的转换
- processing - 如何在两个类之间进行碰撞?
- python - 是否可以在 Libreoffice Calc 中使用 Selenium WebDriver?
- git - 如何在 git 中删除不再需要的分支?