如何给dart中的整数范围命名?

rseugnpd  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(105)

我想将属性保存在列表中。所以我想通过属性名称访问列表项。
现在我使用以下方法:

enum Scooter { power, capacity, model }

void main() {
  final scooter = [50, 1000, "Suzuki"];
  print(scooter[Scooter.model.index]);
}

还有更好的办法吗?

06odsfpq

06odsfpq1#

使用常量。

const scooterPower = 0;
const scooterCapacity = 1;
const scooterModel = 2;

void main() {
  final scooter = [50, 1000, "Suzuki"];
  print(scooter[ScooterModel]);
}

或者使用helper函数:

int scooterPower(List<dynamic> list) => list[0];
int scooterCapacity(List<dynamic> list) => list[1];
String scooterModel(List<dynamic> list) => list[2];

void main() {
  final scooter = [50, 1000, "Suzuki"];
  print(scooterModel(scooter));
}

或者,如果静态辅助函数太过时了,可以使用扩展getters:

extension ScooterProperties on List<dynamic> {
  int get scooterPower => this[0];
  int get scooterCapacity => this[1];
  String get scooterModel => this[2];
}

void main() {
  final scooter = [50, 1000, "Suzuki"];
  print(scooter.scooterModel);
}

在任何情况下,你都没有静态类型安全,如果你在实际上不是“有效的scooter列表”的东西上使用任何访问方法,都会得到运行时错误。
在Dart的下一个版本中,你可以使用模式,更简洁地做一些测试,比如:

extension ScooterProperties on List<dynamic> {
  int get scooterPower {
    if (this case [int power, int _, String _]) return power;
    throw StateError("Not a scooter list");
  }
  int get scooterCapacity {
    if (this case [int _, int capacity, String _]) return capacity;
    throw StateError("Not a scooter list");
  }
  String get scooterModel {
    if (this case [int _, int _, String model]) return model;
    throw StateError("Not a scooter list");
  }
}

void main() {
  final scooter = [50, 1000, "Suzuki"];
  print(scooter.scooterModel);
}

再过一段时间,您也许可以使用内联类来廉价地 Package 列表。

inline class Scooter {
  final List<dynamic> _list;
  Scooter(List<dynamic> list) : _list = list;
    if (list case [int _, int _, String _]) return;
    throw ArgumentError.value(list, "list", "Not a valid scooter list");
  }
  int get power => _list[0];
  int get capacity => _list[1];
  String get model => _list[2]; 
}

void main() {
  final scooter = Scooter([50, 1000, "Suzuki"]);
  print(scooter.model);
}

(在此之前,您还可以使用非inline类来做同样的事情。

相关问题