将参数约束在Julia函数签名中的一组值中

将参数约束在Julia函数签名中的一组值中,julia,Julia,Julia中是否有方法指定函数参数可以通过类型注释获取一组值中的一个?例如,假设我有一个函数foo,它接受一个参数 function foo(x::String) print(x) end 参数x只能是字符串。是否有办法在函数签名中进一步约束它,使其只能是例如字符串“right”、“left”或“center”中的一个。这将是对值的分派,这在Julia中是不可能的。 我不确定您的实际应用程序是什么,但可能有一些适当的解决方法,例如: abstract Sam81Args type Ar

Julia中是否有方法指定函数参数可以通过类型注释获取一组值中的一个?例如,假设我有一个函数
foo
,它接受一个参数

function foo(x::String)
    print(x)
end

参数
x
只能是字符串。是否有办法在函数签名中进一步约束它,使其只能是例如字符串“right”、“left”或“center”中的一个。这将是对值的分派,这在Julia中是不可能的。 我不确定您的实际应用程序是什么,但可能有一些适当的解决方法,例如:

abstract Sam81Args
type ArgRight <:Sam81Args end
type ArgLeft <:Sam81Args end
type ArgCenter <:Sam81Args end
function foo{T<:Sam81Args}(x::Type{T})
    println(T)
end
foo(ArgCenter)
抽象Sam81Args

输入ArgRight在Julia中,格言应该是“有一种类型适合它!”。 处理这种情况的一种方法是使用构造函数创建一个类型,该构造函数只允许您想要的值(并可能以更高效的方式存储它们)。 以下是一个例子:

const directions = ["left", "right", "center"]
immutable MyDirection
    Direction::Int8
    function MyDirection(str::AbstractString)
        i = findnext(directions, str, 1)
        i == 0 && throw(ArgumentError("Invalid direction string"))
        return new(i)
    end
end

Base.show(io::IO, x::MyDirection) = print(io, string("MyDirection(\"",directions[x.Direction],"\")"))
function foo(x::MyDirection)
    println(x)
end

function foo(str::AbstractString)
    x = MyDirection(str)
    println(x)
end

test = MyDirection("left")

foo(test)

foo("right")
注意:我的示例是用Julia 0.4编写的

编辑: 另一种方法是使用符号,例如:left、:right和:center, 而不是字符串。 它们的优点是可以进行内部比较(这样就可以简单地通过比较地址进行比较),也可以直接用于类型参数

例如:

immutable MyDirection{Symbol} ; end
function MyDirection(dir::Symbol)
    dir in (:left, :right, :center) || error("invalid direction")
    MyDirection{dir}()
end
MyDirection(dir::AbstractString) = MyDirection(symbol(dir))
这将使您可以执行以下操作: x=我的方向(“左”) 它将创建类型为MyDirection{:left}的不可变对象