You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart 2.2后Set字面量设置及结构体式集合初始化问题求助

如何在Dart 2.2+中高效初始化自定义类的集合(类似C结构体初始化)

嘿,我完全懂你想要的那种简洁感——就像C语言初始化结构体数组那样,一行搞定一个实例,不用繁琐地逐行赋值对吧?你之前尝试用{"map", 9, 1}这种写法报错,是因为这在Dart里是Set字面量,而Set是用来存单一类型元素的集合,根本不是用来创建自定义类实例的方式。下面给你几个完美的解决方案,实现和C一样高效的初始化体验:

方案1:使用简化构造函数(最接近C的写法)

给你的自定义类添加一个简洁的构造函数,Dart的语法糖能帮你自动完成参数到成员变量的赋值:

// 注意Dart中类名一般用大驼峰命名规范,推荐改成Item而不是item_t
class Item {
  String name;
  int weight;
  int value;

  // 简化构造函数:用this.直接绑定成员变量,无需手动赋值
  Item(this.name, this.weight, this.value);
}

void main() {
  // 现在可以像C那样一行初始化一个实例,组装成列表!
  List<Item> items = [
    Item("map", 9, 150),
    Item("compass", 13, 35),
    Item("water", 153, 200),
    Item("sandwich", 50, 160),
    Item("glucose", 15, 60),
    // ... 剩下的所有项都可以按这个格式写
  ];

  print(items[0].weight); // 输出9,完全符合预期
}

这个写法和你贴的C代码几乎一样简洁,而且Dart会自动处理参数赋值,比你之前逐行给items[0].name赋值的方式高效太多,代码可读性也强。

方案2:使用命名参数构造函数(更清晰,避免参数顺序错误)

如果你的类成员变量比较多,担心记混参数顺序,可以用命名参数的构造函数,可读性拉满:

class Item {
  String name;
  int weight;
  int value;

  // 用required标记必填参数(Dart 2.12+支持)
  Item({required this.name, required this.weight, required this.value});
}

void main() {
  List<Item> items = [
    Item(name: "map", weight: 9, value: 150),
    Item(name: "compass", weight: 13, value: 35),
    // ... 其他项
  ];
}

这种方式虽然多写了参数名,但永远不会因为参数顺序搞混导致错误,维护起来更省心。

方案3:创建不可变常量集合(性能更优)

如果你的集合数据是静态不变的,还可以把类改成不可变类,用const构造函数创建编译时常量集合:

class Item {
  // 用final标记不可变成员变量
  final String name;
  final int weight;
  final int value;

  // const构造函数,确保实例是编译时常量
  const Item(this.name, this.weight, this.value);
}

void main() {
  // Dart 2.17+可以省略列表和实例前的const,直接写Item(...)
  const List<Item> items = [
    Item("map", 9, 150),
    Item("compass", 13, 35),
    // ... 其他项
  ];
}

这种方式创建的集合在编译时就确定了内容,运行时性能更好,适合存储静态配置数据。


内容的提问来源于stack exchange,提问作者madeinQuant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:13:01