dart - 将Dart用作DSL

标签 dart

我正在尝试使用Dart遵循代码=配置的习惯用法简洁地定义应用程序中的实体。由于我将定义许多实体,因此我希望代码保持简洁,简洁和易读。

为了使样板尽可能接近0行,我最近编写了一些如下代码:

// man.dart
part of entity_component_framework;

var _man = entity('man', (entityBuilder) {
  entityBuilder.add([TopHat, CrookedTeeth]);
})

// test.dart
part of entity_component_framework;
var man = EntityBuilder.entities['man']; // null, since _man wasn't ever accessed.
entity方法将传递给函数的entityBuilder与名称(在这种情况下为“man”)相关联。之所以存在var _man,是因为Dart中只有变量赋值可以是顶级的。这似乎是将Dart用作DSL的最简洁方法。

我没有指望的一件事是延迟初始化。如果我从不访问_man,并且我无意这样做,因为entity函数将我需要的所有相关信息整齐地存储在另一个数据结构中,那么就永远不会运行entity函数。 This is a feature, not a bug

那么,鉴于延迟初始化的限制,将Dart用作DSL的最干净的方法是什么?

最佳答案

因此,正如您所指出的,Dart的一个功能是在被告知之前不会运行任何代码。因此,如果您希望发生某些事情,则需要在运行的代码中进行操作。一些可能性

将对entity()的调用放在main()函数中。我假设您不想这样做,并且可能您希望人们能够在不修改原始文件的情况下将更多文件添加到其他文件中。

如果您愿意承担镜像的开销(如果将镜像限制在该库中的话)可能不会那么多,请使用它们查找该库中的所有顶级变量并进行访问。或将它们定义为函数或 setter/getter 。但我假设您喜欢变量自动自动生成的特性。您想使用MirrorsUsed注释。

对此的一种变体是使用批注标记要初始化的事物。尽管这很相似,但是您必须遍历带注释的内容,我认为这也需要镜像。

关于dart - 将Dart用作DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20983035/

相关文章:

dart - 如何从DART字符串列表中获取 map 对象列表

Flutter:具有持久性BottomNavigationBar 的嵌套路由,但不会不必要地构建未选择的页面

dart - Dart 中 const 构造函数初始化失败

firebase - Flutter ListView.builder 在滚动时结结巴巴并跳到顶部

google-app-engine - Dart-为Google Cloud Datastore的dart数据存储对象插入索引

firebase - Flutter cloud_firestore 系统日期对象的设置/警告

algorithm - dart 的列表库使用什么排序算法?

windows - 是否有在 Flutter Desktop for Windows 上使用 sqlite 的解决方案?

flutter - 如何使用Flutter使用BloC访问登录时获得的身份验证 token

windows - 是否有任何解决方案可以使用带有 Flutter 桌面的笔记本电脑相机拍照?