Hello,
I have an enum like
julia> @enum Fruit apple=1 orange=2 kiwi=3
I can check that apple
is a Fruit
julia> apple isa Fruit
true
But can’t check if 3 is an “allowed” value (ie a value which is used by this enum)
julia> 4 isa Fruit
false
julia> 3 isa Fruit
false
I tried 3 in Fruit
or 3 in keys(Fruit)
but enum are not iterable.
I haven’t dive into Enum internals… but maybe someone here can help.
(and docstring could probably be improved)
@noinline enum_argument_error(typename, x) = throw(ArgumentError(string("invalid value for Enum $(typename): $x")))
"""
@enum EnumName[::BaseType] value1[=x] value2[=y]
Create an `Enum{BaseType}` subtype with name `EnumName` and enum member values of
`value1` and `value2` with optional assigned values of `x` and `y`, respectively.
`EnumName` can be used just like other types and enum member values as regular values, such as
# Examples
```jldoctest fruitenum
julia> @enum Fruit apple=1 orange=2 kiwi=3
julia> f(x::Fruit) = "I'm a Fruit with value: \$(Int(x))"
f (generic function with 1 method)
julia> f(apple)
"I'm a Fruit with value: 1"
julia> Fruit(1)
apple::Fruit = 1
Kind regards
You could use the instances
function.
For example, you can define
const fruitvals = Set(Int(f) for f in instances(Fruit))
and then do
julia> 3 in fruitvals
true
julia> 17 in fruitvals
false
2 Likes
If you need something generic, the only real way I can see is the ugly
julia> function ismember(enum::Type{T}, v::Int) where T<:Enum
try
T(v)
return true
catch
return false
end
end
ismember (generic function with 1 method)
julia> @enum Fruit apple=1 orange=2 kiwi=3
julia> ismember(Fruit, 1)
true
julia> ismember(Fruit, 4)
false
The list of available values (https://github.com/JuliaLang/julia/blob/29b47b8a10397324a820717af655cb0ee1d7f023/base/Enums.jl#L133 ) is not easily available (edit: nvm, see below).
1 Like
You can also use the undocumented internal function Base.Enums.namemap
:
julia> 4 in keys(Base.Enums.namemap(Fruit))
false
and there are also the typemin
and typemax
functions to get the minimum and maximum allowed values:
julia> Int.((typemin(Fruit), typemax(Fruit)))
(1, 3)