如何在Julia中传递枚举函数参数?

时间:2014-03-13 22:54:23

标签: julia

我是C和Matlab程序员搬到Julia,我试图了解函数选项在传入时的外观。

有时,函数根据传入的参数提供不同的功能,并使用有限数量的不同选项。在C中,它看起来像这样:

enum Options{
    OPTION_1,
    OPTION_2
};

// Other arguments omitted
void foo(..., enum Options option){
    switch(option){
    case OPTION_1:
        // Do something
    break;
    case OPTION_2:
        // Do something else
    break;
    }
}

在朱莉娅,我不知道如何构建这个。我的第一次尝试使用了抽象类型的层次结构,然后是一个接受单例类型来做出决定的函数。请参阅以下代码:

abstract Options
abstract Option_1 <: Options
abstract Option_2 <: Options

function foo{T<:Options}(..., ::Type{T})
    if isa(Option_1, Type{T}
        //Do something
    elseif isa(Option_2, Type{T})
        //Do something else
    end
end

然而,这似乎是解决问题的一种非常奇怪的方式;创建类型只是为了控制函数输入感觉非常奇怪。

另外,为了澄清,我不认为这是Julia中通用参数化方法可解决的解决方案。我正在寻找能够指定标志的用户(例如运行版本1或版本2),根据输入类型没有不同的功能。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我认为参数化方法实际上正是您所寻找的。

abstract Option_1
abstract Option_2

foo{T<:Options_1}(...) = do_something()
foo{T<:Options_2}(...) = do_something_else()

如果两个实现之间存在公共代码,则将其分解为另一个函数并在两者中使用它。朱莉娅没有枚举,但它确实有办法完成同样的事情,参数方法是完全有效的方法。

答案 1 :(得分:0)

如果你分析你的问题,你正在做的是通过一个参数选择两种不同的功能之一。因此,你实际上在一个函数中混合了两个不同的函数,你可以(并且应该)将两个不同的函数分成两个不同的函数。

完成此操作后,只需一小步即可确定您决定调用哪个函数的方式可能(或至少经常)与对象类型相关。但是,如果您提供有关实际用例的更多详细信息,我们可以建议其他替代方案。例如,它可能只是一个布尔变量,可以打开或关闭某种类型的行为。

请注意,在Julia v0.4(当前稳定版本)中,您还可以使用@enum创建类似于C中可用的enum:请参阅NEWS.md file。< / p>