Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Dart作为DSL_Dart - Fatal编程技术网

使用Dart作为DSL

使用Dart作为DSL,dart,Dart,我尝试使用Dart在应用程序中简洁地定义实体,遵循代码=配置的习惯用法。因为我将定义许多实体,所以我希望代码尽可能简洁易读 为了使样板文件尽可能接近0行,我最近编写了如下代码: //man.dart 实体组件框架的一部分; var_man=实体('man',(entityBuilder){ entityBuilder.add([TopHat,crokedteeth]); }) //飞镖 实体组件框架的一部分; var man=EntityBuilder.entities['man'];//空,因

我尝试使用Dart在应用程序中简洁地定义实体,遵循代码=配置的习惯用法。因为我将定义许多实体,所以我希望代码尽可能简洁易读

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

//man.dart
实体组件框架的一部分;
var_man=实体('man',(entityBuilder){
entityBuilder.add([TopHat,crokedteeth]);
})
//飞镖
实体组件框架的一部分;
var man=EntityBuilder.entities['man'];//空,因为从来没有访问过。
entity
方法将传递到函数中的entityBuilder与名称(本例中为“man”)相关联<存在代码>变量人,因为Dart中只有变量分配可以是顶级的。这似乎是将Dart用作DSL的最简洁的方法

不过,有一件事我没有指望,那就是延迟初始化。如果我从未访问过
\u man
,而且我也无意访问,因为
实体
函数将我需要的所有相关信息整齐地存储在另一个数据结构中,那么
实体
函数永远不会运行


那么,考虑到延迟初始化限制,使用Dart作为DSL最干净的方法是什么呢?

因此,正如您所指出的,Dart在被告知之前不会运行任何代码。所以,如果您想让某些事情发生,您需要在运行的代码中执行。一些可能性

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

如果您愿意承担镜像的开销(如果镜像仅限于此库,那么开销可能不会太大),请使用镜像查找该库中的所有顶级变量并访问它们。或者将它们定义为函数或getter。但是我假设你喜欢这样的特性,变量是自动一次性的。您可能希望使用镜像使用的注释


另一种变体是使用注释来标记要初始化的内容。虽然这与您必须迭代带注释的内容类似,但我认为这也需要镜像。

因此,正如您所指出的,Dart在被告知之前不会运行任何代码。所以,如果您想让某些事情发生,您需要在运行的代码中执行。一些可能性

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

如果您愿意承担镜像的开销(如果镜像仅限于此库,那么开销可能不会太大),请使用镜像查找该库中的所有顶级变量并访问它们。或者将它们定义为函数或getter。但是我假设你喜欢这样的特性,变量是自动一次性的。您可能希望使用镜像使用的注释


另一种变体是使用注释来标记要初始化的内容。虽然这是相似的,您必须迭代注释的内容,我认为这也需要镜像。

我认为您需要提供更多上下文。我不清楚你想做什么。但是在小图片中,您可以将其设置为(entityBuilder)=>entityBuilder.add([TopHat,CrookedTeeth]);并让add方法返回已添加的内容。然后你可以说var-man=\u-man;我已经编辑了这个问题。基本上,我尝试使用Dart来配置实体,而不是解析YAML或其他配置文件。然而,懒惰的初始化使我无法使用更简洁的风格换句话说,延迟初始化阻止我使用DSL而不必首先接触临时变量(我不需要使用临时变量,因为我将直接使用示例中的数据存储“potatoSack”)。我认为您需要提供更多上下文。我不清楚你想做什么。但是在小图片中,您可以将其设置为(entityBuilder)=>entityBuilder.add([TopHat,CrookedTeeth]);并让add方法返回已添加的内容。然后你可以说var-man=\u-man;我已经编辑了这个问题。基本上,我尝试使用Dart来配置实体,而不是解析YAML或其他配置文件。然而,懒惰的初始化使我无法使用更简洁的风格换一种说法,延迟初始化阻止我在不接触临时变量的情况下使用DSL(我不需要使用临时变量,因为我将直接使用示例中的数据存储“potatoSack”)。同意,镜像是最好的选择。如果我理解正确,您希望以声明方式定义实体,以便在全局数据结构中定义它们。Dart在这方面并不擅长,原因正是您发现的:代码不是隐式执行的,您需要显式访问getter或调用方法,或者只访问延迟初始化的字段。这意味着需要触发初始化代码。您需要在某个地方调用某些东西(可能使EntityBuilder成为延迟初始化的对象而不是类),并使用镜像来查找声明。我决定使用
dart:mirrors
来迭代符合特定命名方案的私有顶级变量声明。10行额外的代码,但不是那么糟糕,我想所有的事情都考虑过了。同意,镜像是你最好的选择。如果我理解正确,您希望以声明方式定义实体,以便在全局数据结构中定义它们。Dart在这方面并不擅长,原因正是您发现的:代码不是隐式执行的,您需要显式访问getter或调用getter