如何将匿名函数直接注入枚举

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));
}