ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
enum 构造器可以使用参数,就像函数那样。要展示这个功能,一个简单的查询生成器,利用Haxe的强类型语法像下面那样定义: ~~~ enum Condition { TestIsNull(field : String); TestNumber(field : String, operator : NumericOp, value : Float); TestText (field : String, operator : TextOp, value : String); And (tests : Array < Condition > ); Or (tests : Array < Condition > ); } enum NumericOp { Equal; Different; MoreThan; LessThan; } enum TextOp { Same; Like; } ~~~ enum Condition包含每个可能的查询可以定义的测试的构造器(更多定义也有可能,但是列表为了清晰保持简洁)。注意 and 和or 的构造器是递归的,因为他们使用 Condition 在他们的参数。后面两个枚举表示当对比一个字段和value时使用的操作符。 现在需要的是一个工具类来操作你的 enum 。 ~~~ class QueryTools { static public function toSql(q : Condition) : String { return switch(q) { case TestIsNull(field): field + “ IS NULL”; case TestNumber(field, operator, value): field + “ “ + getNumericOp(operator) + “ “ + value; case TestText(field, operator, value): field + “ “ + getTextOp(operator) + “ ‘” + StringTools.replace(value, “’”, “\’”) + “’”; case And(tests): join(tests, “AND”); case Or(tests): join(tests, “OR”); } } private static function join(tests : Array < Condition > , op : String) : String { return “(“ + Lambda.map(tests, toSql).join(“ “ + op + “ “) + “)”; } private static function getNumericOp(op : NumericOp) : String { return switch(op) { case Equal: “=”; case Different: “!=”; case MoreThan: “ > ”; case LessThan: “ < ”; } } private static function getTextOp(op : TextOp) : String { return switch(op) { case Same: “=”; case Like: “LIKE”; } } } ~~~ 在一个switch语句中从构造器提取参数的语法如下: ~~~ switch(name) { case Constructor(p1, p2): /* do something here */; } ~~~ param 没有指定的类型因为类型直接继承自构造器定义。 现在可以这样使用enum: ~~~ class Main { static function main() { var t = And([ TestText(‘name’, Same, ‘John’), TestText(‘lastname’, Same, ‘Doe’), Or([ And([ TestIsNull(‘age’), TestText(‘notes’,Like, ‘%authorized%’), ]), TestNumber(‘age’, MoreThan, 18) ]) ]); trace(QueryTools.toSql(t)); } } ~~~ 这回很好的输出: ~~~ (name = ‘John’ AND lastname = ‘Doe’ AND ((age IS NULL AND notes LIKE ‘%authorized%’) OR age > 18)) ~~~ 重要的要注意使用 switch 是唯一的可用方式提取关联构造器的值,无需重现在 Reflection(16章详细了解)。 就像看到的其他类型,enum还可以使用类型参数。这是一个简短的例子来输出: ~~~ enum ValueStatus < T > { NonExistent; Unknown; Known(value : T); } ~~~ 看看第16章的 Reflection API 一节学习如何检索enum构造器的index ,显然,当你希望使用enum 索引他们的位置在类型声明是相关的:第一个构造器声明有索引0,并且索引值是递增1的在每个随后的构造器中。