gpt4 book ai didi

javascript - Game Screeps - 查找过滤器和静态类型语言(Scala) - 如何正确外观?

转载 作者:行者123 更新时间:2023-11-28 05:07:12 25 4
gpt4 key购买 nike

我正在尝试将 JavaScript 教程代码移植到 Scala.js,但在过滤结构上遇到了困难 - 任何建议将不胜感激。

原始代码:

// If creep is supposed to transfer energy to a structure
if (creep.memory.working == true) {

// Find closest spawn, extension or tower which is not full
var structure = creep.pos.findClosestByPath(FIND_MY_STRUCTURES, {
filter: (s) => (s.structureType == STRUCTURE_SPAWN
|| s.structureType == STRUCTURE_EXTENSION
|| s.structureType == STRUCTURE_TOWER)
&& s.energy < s.energyCapacity });

Scala.js 中的代码:

val structure = Option[Structure](creep.pos.findClosestByPath[Structure](FIND_MY_STRUCTURES,
FindFilter[Structure](structure => {
(structure.structureType == STRUCTURE_SPAWN ||
structure.structureType == STRUCTURE_EXTENSION ||
structure.structureType == STRUCTURE_TOWER) &&
structure.energy < structure.energyCapacity })))

问题是并非所有结构类型都具有 .energy,因此尽管过滤后的结构类型具有 .energy,但它无法编译?

我尝试定义一个特征 HasEnergy (类似于 JavaScript 接口(interface))并像 FindFilter[Structure with HasEnergy] 一样使用它,它可以编译,但现在我在运行时遇到类型错误 -> TypeError: a.k is不是函数

我的外观如下所示:

@js.native
trait HasEnergy extends js.Object {
val energy: Int
val energyCapacity: Int
}

@js.native
trait Structure extends RoomObject with HasID {
val hits: UndefOr[Int]
val hitsMax: UndefOr[Int]
val id: String
val structureType: String
def destroy(): Int
def isActive(): Boolean
def notifyWhenAttacked(enabled: Boolean): Int
}

最佳答案

好的,这是我想出的解决方案:

  val structure = {
Option(creep.pos.findClosestByPath[OwnedStructureWithEnergy](FIND_MY_STRUCTURES, FindFilter[OwnedStructureWithEnergy](s =>
((s.structureType == STRUCTURE_SPAWN) ||
(s.structureType == STRUCTURE_EXTENSION) ||
(s.structureType == STRUCTURE_TOWER)) &&
(s.energy < s.energyCapacity))))
}

事实证明,我的 findClosestByPath Facade 中存在错误。根据 API 的正确版本支持FindFilterFindFilterAlgorithm - 前者在我的映射中丢失了。正确的现在看起来像这样:

  def findClosestByPath[T](typ: Int, opts: FindFilter[T] | FindFilterAlgorithm[T] = ???): T
@JSName("findClosestByPath")

现在为了通过点使用成员访问,我添加了特征OwnedStructureWithEnergy:

@js.native
trait OwnedStructureWithEnergy extends OwnedStructure {
val energy: Int = js.native
val energyCapacity: Int = js.native
}

关于javascript - Game Screeps - 查找过滤器和静态类型语言(Scala) - 如何正确外观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41648150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com