首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Bucklescript中对名为(IE在运行时命名)属性使用方法

在Bucklescript中对名为(IE在运行时命名)属性使用方法
EN

Stack Overflow用户
提问于 2017-07-17 10:49:49
回答 1查看 74关注 0票数 0

因此,我正试图为Screep游戏编写一个AI程序,它的文档被发现为这里

我正在尝试用OCaml编写我的人工智能,然后我通过Bucklescript将其编译为Javascript,后者的文档被发现为这里

在Screeps中,任何一个人都是Game.spawns.SPAWN_NAME.createCreep方法,在该方法中,SPAWN_NAME对应于所讨论的“派生”对象的名称。它接受一个字符串数组,对应于“爬行”的各个身体部分--它正在帮助产卵,并且给定正确的函数调用(有足够的能量储备),您的爬行将在游戏中产卵。

一个示例调用(在JS中)是Game.spawns['Spawn1'].createCreep(["body","move"]);

我已经有了代码,它为我提供了一个string array,其中包含了OCaml中的所有子类。该守则是:

代码语言:javascript
复制
let spawns : string array = [%bs.raw{|Object.keys(Game.spawns)|}]
let spawnsArray : string array = spawns

假设我有一个名为Spawn1的子程序,并且在OCaml中也有一个用于主体组合的字符串数组:

代码语言:javascript
复制
let spawnName : string = "Spawn1" 
let body : string array = [|"body","move|]

然后,我使用如下所示的for循环遍历该数组中的每个字符串:

代码语言:javascript
复制
for i=0 to Array.length spawns - 1 do
  // I WANT TO CALL SOMETHING ANALOGOUS TO MY FUNCTION HERE
done

在我的生活中,我只是想不出如何格式化Bucklescript绑定,这样我就可以用body : string arrayspawnName : string动态调用body : string array函数。任何帮助都会很棒。我知道在Bucklescript文档中简要地描述了bs.getbs.set方法,但我不知道如何使用它们。

提前谢谢你的帮助。

编辑:

通过在Javascript模块中编写我自己的“接口”函数,我设法“解决”了这个问题,然后我可以通过bs.module Bucklescript绑定调用这个模块。

我写了一个函数

代码语言:javascript
复制
function spawnCreepHelper(spawnName, body) {
  Game.spawns[spawnName].createCreep(body);
}

然后我就可以通过

代码语言:javascript
复制
external spawnCreepHelper : string -> string array -> unit = "" 
[@@bs.module "./supplemental", "Supplement"]

在我看来,似乎是被黑了,所以如果有人有另一种方法来接近它,而不是自己重写API,请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2017-07-27 18:27:38

您可能需要索引属性:

代码语言:javascript
复制
type spawn
type spawns
external spawns : spawns = "" [@@bs.val] [@@bs.scope "Game"]
external getSpawn : spawns -> string -> spawn = "" [@@bs.get_index]
external createCreep : spawn -> string array -> unit = "" [@@bs.send]

let _ =
  let spawn = getSpawn spawns "spawn1" in
  createCreep spawn [|"body"; "move"|]

编译成

代码语言:javascript
复制
var spawn = Game.spawns["spawn1"];

spawn.createCreep(/* array */[
      "body",
      "move"
    ]);

然后,您可以通过向Object.keys提供自己的外部类型化来获取密钥。

代码语言:javascript
复制
 external keys : spawns -> string array = "" [@@bs.val] [@@bs.scope "Object"]

 let _ =
   spawns |> keys
          |> Js.Array.forEach Js.log

它将编译成

代码语言:javascript
复制
Object.keys(Game.spawns).forEach((function (prim) {
        console.log(prim);
        return /* () */0;
      }));   

或者,您可以将spawns键入为spawn Js.Dict,并使用BuckleScript已经提供的函数来访问和操作它:https://bucklescript.github.io/bucklescript/api/Js.Dict.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45142259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档