enums - 用于与枚举进行切换或模式匹配的宏
问题描述
我想要一些语法糖来打开Enum
. 当然,一个if else
块按预期工作:
@enum Fruit apple=1 orange=2 kiwi=3
function talk1(fruit::Fruit)
if fruit == apple
"I like apples."
elseif fruit == orange
"I like oranges."
else
"I like kiwis."
end
end
我什至可以执行以下操作:
function talk2(fruit::Fruit)
say = ["I like apples.", "I like oranges.", "I like kiwis."]
say[Int(fruit)]
end
但我不太喜欢 中的方法talk2
,因为它分配了一个向量并且可读性较差。我尝试了Match.jl包,但我似乎无法匹配Enum
:
using Match
function talk3(fruit::Fruit)
@match fruit begin
apple => "I like apples."
orange => "I like oranges."
kiwi => "I like kiwis."
end
end
julia> talk3(apple)
"I like apples."
julia> talk3(orange)
"I like apples."
julia> talk3(kiwi)
"I like apples."
当然,在@match
宏中我可以将 the强制转换Enum
为 anInt
并匹配 the Int
,但这会妨碍开关的可读性。
有没有办法让Match.jl工作Enum
?或者是否有来自不同包的宏可以打开Enum
?
解决方案
这可能是使用类型而不是枚举的主要原因。然后调度为你处理这个:
abstract type Fruit end
struct Apple <: Fruit end
struct Orange <: Fruit end
struct Kiwi <: Fruit end
talk(fruit::Apple) = "I like apples."
talk(fruit::Orange) = "I like oranges."
talk(fruit::Fruit) = "I like kiwis."
正如https://pixorblog.wordpress.com/2018/02/23/julia-dispatch-enum-vs-type-comparison/指出的那样,此代码被编译器有效地内联。
推荐阅读
- javascript - 如何将文本文件中的行推送到数组中,以便以后对其进行操作
- python - 我的 python 代码做了它打算做的事情,但是中断/继续使用 try/catch 块?
- javascript - 无法在电子中加载反应开发工具
- python - 根据标签、类和字符串内容提取html块
- python - 在有特定键值对的列表中获取字典
- objective-c - 将 method_exchangeImplementations 与 block_invoke 方法一起使用
- c# - 使用 Unity 访问 Bing News API v7 时出现错误 401
- .net - EF Core 无法识别复合键
- html - 如何在 React 中对齐 2 个组件?
- matlab - 添加总和列