像 C++ 中的 Julia 变体
Variant like in C++ for Julia
如何在 Julia 中使用类似 variant
(在 C++ 中)的东西?
在 C++ 中,我可以做这样的事情
variant<int, float> value;
如何在 Julia 中为函数的参数做同样的事情?
function func(??)
# something
end
抱歉,如果它没有传达我想做的事情。
您可以使用 union types 来做同样的事情。
function func(x::Union{Int, AbstractFloat})
x + 1
end
请注意,C++ std::variant
是一个 标记联合 ,因此您可以随时询问它是“哪个”变体,而 Julia 联合是一个适当的集合联合。实际上,这意味着在 std::variant<int, int>
中,您可以区分“左整数”和“右整数”,但 Union{Int, Int}
实际上只是一个 Int
。无法分辨它来自哪“边”。要模拟确切的标记联合行为,您需要制作一些自定义结构来表示每种情况。
struct LeftInt
value :: Int
end
struct RightInt
value :: Int
end
function func(x::Union{LeftInt, RightInt})
# ... Check whether x is a LeftInt or not ...
end
但是,在 Julia 中,你通常不需要这个,如果你需要,那么使用通用函数来进行调度通常更聪明。
在 Julia 中,你可以只写
function func(value)
# something
end
然后,当您使用其他类型调用此无类型函数时,编译器会自动为您编译单独的类型特定方法。
在 Julia 中,与 C++ 不同,您通常根本不提供参数类型,而是让编译器为您确定类型。您提供的任何参数类型都只是断言,或者在您想自己为不同类型提供不同实现的情况下帮助分派到正确的方法。
如何在 Julia 中使用类似 variant
(在 C++ 中)的东西?
在 C++ 中,我可以做这样的事情
variant<int, float> value;
如何在 Julia 中为函数的参数做同样的事情?
function func(??)
# something
end
抱歉,如果它没有传达我想做的事情。
您可以使用 union types 来做同样的事情。
function func(x::Union{Int, AbstractFloat})
x + 1
end
请注意,C++ std::variant
是一个 标记联合 ,因此您可以随时询问它是“哪个”变体,而 Julia 联合是一个适当的集合联合。实际上,这意味着在 std::variant<int, int>
中,您可以区分“左整数”和“右整数”,但 Union{Int, Int}
实际上只是一个 Int
。无法分辨它来自哪“边”。要模拟确切的标记联合行为,您需要制作一些自定义结构来表示每种情况。
struct LeftInt
value :: Int
end
struct RightInt
value :: Int
end
function func(x::Union{LeftInt, RightInt})
# ... Check whether x is a LeftInt or not ...
end
但是,在 Julia 中,你通常不需要这个,如果你需要,那么使用通用函数来进行调度通常更聪明。
在 Julia 中,你可以只写
function func(value)
# something
end
然后,当您使用其他类型调用此无类型函数时,编译器会自动为您编译单独的类型特定方法。
在 Julia 中,与 C++ 不同,您通常根本不提供参数类型,而是让编译器为您确定类型。您提供的任何参数类型都只是断言,或者在您想自己为不同类型提供不同实现的情况下帮助分派到正确的方法。