【问题标题】:Julia - Using metaprogramming to define several functionsJulia - 使用元编程来定义几个函数
【发布时间】:2021-02-21 09:05:58
【问题描述】:

我正在 Julia 中开发一个包,在我的包中,我有几个具有相同布局的函数,但它们使用的参数有一些小的变化。例如:

function MyFunction1(arg1, arg2)
  do(arg1,arg2,parameter1)
end

function MyFunction2(arg1, arg2)
  do(arg1,arg2,parameter2)
end

function MyFunction3(arg1, arg2)
  do(arg1,arg2,parameter3)
end

现在,我想做的是创建一个规范数组,在其中传递函数名称和参数,并使用元编程来定义这些函数,例如:

spec = [["MyFunction1","parameter1"],["MyFunction2","parameter2"],["MyFunction3","parameter3"]]

如何在 Julia 中做到这一点?请注意,这是一个简化的示例,我实际上希望允许更复杂的变化,否则只创建一个带有附加参数的函数而不是创建多个函数会更明智。

【问题讨论】:

    标签: function package julia metaprogramming


    【解决方案1】:

    您应该考虑在这里根本不使用元编程,而是定义一个像这样的通用函数:

    function my_general_function(arg1, arg2, parameters)
       do(arg1, arg2, parameters)
    end
    

    然后你可以在一行中定义每个变体:

    my_function_1(arg1, arg2) = my_general_function(arg1, arg2, parameters1)
    my_function_2(arg1, arg2) = my_general_function(arg1, arg2, parameters2)
    my_function_3(arg1, arg2) = my_general_function(arg1, arg2, parameters3)
    

    如果arg1arg2 部分写出来太烦人了,你可以写一个这样的函数生成器:

    function my_function_generator(parameters)
       (arg1, arg2) -> do(arg1, arg2, parameters)
    end
    

    然后你像这样定义每个专门的版本:

    const my_function_1 = my_function_generator(parameters1)
    const my_function_2 = my_function_generator(parameters2)
    const my_function_3 = my_function_generator(parameters3)
    

    这可以通过宏来完成,但这里不需要它们,如果可能的话,如果你坚持使用高阶函数(将函数作为参数或返回函数的函数)而不是宏,事情通常会更简单、更清晰。

    【讨论】:

    • OP 想要数组中的参数,但这个答案会做到这一点,只需制作最后一个代码框 map(my_function_generator, paramlist) 对吗?
    猜你喜欢
    • 2016-09-10
    • 1970-01-01
    • 2017-03-19
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多