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

如何在Julia中传递枚举函数参数?,julia,Julia,我是一名C和Matlab程序员,即将加入Julia,我试图了解传入函数选项时的外观 有时,一个函数根据传入的参数提供不同的功能,该参数包含有限的不同选项。在C中,它可能看起来像这样: enum Options{ OPTION_1, OPTION_2 }; // Other arguments omitted void foo(..., enum Options option){ switch(option){ case OPTION_1: //

我是一名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
抽象选项

抽象选项_1我认为参数化方法实际上正是您想要的

abstract Option_1
abstract Option_2

foo{T<:Options_1}(...) = do_something()
foo{T<:Options_2}(...) = do_something_else()
抽象选项\u 1
抽象选项2

foo{T如果你分析你的问题,你所做的是通过一个参数从两个不同的功能中选择一个。因此,你实际上在一个函数中混合了两个不同的功能,你可以(也应该)将这两个不同的功能分成两个不同的功能

一旦你完成了这项工作,你就很快意识到你决定调用哪一个函数的方式可能是(或者至少经常是)与对象类型相关。但如果您提供实际用例的更多详细信息,我们可以建议其他替代方案。例如,它可能只是一个布尔变量,用于打开或关闭某种类型的行为


请注意,在Julia v0.4(当前的稳定版本)中,您也可以使用
@enum
创建类似于C中可用的
enum
s:请参阅。

好的,非常感谢。对我来说,这仍然感觉像是滥用了类型系统,但也许我只是开始在Julia中编程Julia,而不是尝试模仿C。