如何将匿名函数直接注入枚举
How do I inject an anonymous function directly into an enum
对于 Dart 2.17,我们可以像在 类.
中那样在枚举中使用构造函数
我正在尝试直接在枚举中插入匿名函数。
这是有效的代码,但不完全符合我的要求。
int _add(int a, int b) => a + b;
int _sub(int a, int b) => a - b;
int _mul(int a, int b) => a * b;
double _div(int a, int b) => a / b;
enum MyEnum {
addition(_add),
subtract(_sub),
multiplication(_mul),
division(_div);
final Function fx;
const MyEnum(this.fx);
}
void main() {
var fun = MyEnum.addition;
print(fun.fx(1, 2));
fun = MyEnum.subtract;
print(fun.fx(1, 2));
fun = MyEnum.multiplication;
print(fun.fx(1, 2));
fun = MyEnum.division;
print(fun.fx(1, 2));
}
我不想在代码的其他地方创建一个函数,如_add、_sub、_mul、_div,我想直接在枚举中插入一个匿名函数,就像下面的代码(请注意下面的代码无效)。
我想做什么
enum MyEnum {
// I'd like to insert an anonymous function instead.
addition((int a, int b) => _add(a, b)),
subtract((int a, int b) => a - b),
multiplication(int a, int b) => a * b),
division((int a, int b) => a / b;);
final Function fx;
const MyEnum(this.fx);
}
可能吗?谁能告诉我该怎么做?我不知道我做错了什么。
您尝试过扩展吗?我不确定你是否能够做任何你想做的事(就像发生在我身上的那样),但他们几乎完成了工作。有时我只需要调用扩展而不是枚举,可能是当我在扩展上放置一些静态方法时(比如调用 SexExt.staticMethod()
而不是 Sex.staticMethod
),但我发现它们非常有用。
enum Sex { MALE, FEMALE }
extension SexExt on Sex {
String getText() {
switch (this) {
case Sex.MALE:
return "Maschio";
case Sex.FEMALE:
return "Femmina";
}
}
String getShortText() {
switch (this) {
case Sex.MALE:
return "M";
case Sex.FEMALE:
return "F";
}
}
}
Dart 2.17 的一点是您不再需要使用扩展。以下代码结合了 Dart 2.17 的特性,是我如何解决的。虽然这肯定不像我希望的那样优雅或令人满意,但它在我原来的 post.
enum MyEnum {
addition(),
subtract(),
multiplication(),
division();
Function fx() {
switch (this) {
case addition:
return (int a, int b) => a + b;
case subtract:
return (int a, int b) => a - b;
case multiplication:
return (int a, int b) => a * b;
case division:
return (int a, int b) => a / b;
default:
throw Exception('Unknown operation');
}
}
const MyEnum();
}
void main() {
var fun = MyEnum.addition;
print(fun.fx()(1, 2));
fun = MyEnum.subtract;
print(fun.fx()(1, 2));
fun = MyEnum.multiplication;
print(fun.fx()(1, 2));
fun = MyEnum.division;
print(fun.fx()(1, 2));
}
对于 Dart 2.17,我们可以像在 类.
中那样在枚举中使用构造函数我正在尝试直接在枚举中插入匿名函数。
这是有效的代码,但不完全符合我的要求。
int _add(int a, int b) => a + b;
int _sub(int a, int b) => a - b;
int _mul(int a, int b) => a * b;
double _div(int a, int b) => a / b;
enum MyEnum {
addition(_add),
subtract(_sub),
multiplication(_mul),
division(_div);
final Function fx;
const MyEnum(this.fx);
}
void main() {
var fun = MyEnum.addition;
print(fun.fx(1, 2));
fun = MyEnum.subtract;
print(fun.fx(1, 2));
fun = MyEnum.multiplication;
print(fun.fx(1, 2));
fun = MyEnum.division;
print(fun.fx(1, 2));
}
我不想在代码的其他地方创建一个函数,如_add、_sub、_mul、_div,我想直接在枚举中插入一个匿名函数,就像下面的代码(请注意下面的代码无效)。
我想做什么
enum MyEnum {
// I'd like to insert an anonymous function instead.
addition((int a, int b) => _add(a, b)),
subtract((int a, int b) => a - b),
multiplication(int a, int b) => a * b),
division((int a, int b) => a / b;);
final Function fx;
const MyEnum(this.fx);
}
可能吗?谁能告诉我该怎么做?我不知道我做错了什么。
您尝试过扩展吗?我不确定你是否能够做任何你想做的事(就像发生在我身上的那样),但他们几乎完成了工作。有时我只需要调用扩展而不是枚举,可能是当我在扩展上放置一些静态方法时(比如调用 SexExt.staticMethod()
而不是 Sex.staticMethod
),但我发现它们非常有用。
enum Sex { MALE, FEMALE }
extension SexExt on Sex {
String getText() {
switch (this) {
case Sex.MALE:
return "Maschio";
case Sex.FEMALE:
return "Femmina";
}
}
String getShortText() {
switch (this) {
case Sex.MALE:
return "M";
case Sex.FEMALE:
return "F";
}
}
}
Dart 2.17 的一点是您不再需要使用扩展。以下代码结合了 Dart 2.17 的特性,是我如何解决的。虽然这肯定不像我希望的那样优雅或令人满意,但它在我原来的 post.
enum MyEnum {
addition(),
subtract(),
multiplication(),
division();
Function fx() {
switch (this) {
case addition:
return (int a, int b) => a + b;
case subtract:
return (int a, int b) => a - b;
case multiplication:
return (int a, int b) => a * b;
case division:
return (int a, int b) => a / b;
default:
throw Exception('Unknown operation');
}
}
const MyEnum();
}
void main() {
var fun = MyEnum.addition;
print(fun.fx()(1, 2));
fun = MyEnum.subtract;
print(fun.fx()(1, 2));
fun = MyEnum.multiplication;
print(fun.fx()(1, 2));
fun = MyEnum.division;
print(fun.fx()(1, 2));
}