我是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),根据输入类型没有不同的功能。
感谢您的帮助!
答案 0 :(得分:1)
我认为参数化方法实际上正是您所寻找的。 p>
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>