0

当我运行我的代码时,它给了我这个错误:

类型错误:枢轴未定义

这是错误所指的相关类:

class Hero
  constructor: (@color, @direction, @x, @y) ->
  pivots: []
  addPivot: (pivot) -> @pivots.push(pivot)
  onPivot: (pivot) -> pivot.x == @x && pivot.y == @y
  applyPivots: () ->
    indexToRemove = -1
    for i in [0..@pivots.length - 1]
      pivot = @pivots[i]
      if (@onPivot(pivot))
        @direction = pivot.direction
        indexToRemove = i
    @pivots.splice(indexToRemove, 1)

为什么会这样?这是它生成的javascript:

  Hero = (function() {
    function Hero(color, direction, x, y) {
      this.color = color;
      this.direction = direction;
      this.x = x;
      this.y = y;
    }

    Hero.prototype.pivots = [];

    Hero.prototype.addPivot = function(pivot) {
      return this.pivots.push(pivot);
    };

    Hero.prototype.onPivot = function(pivot) {
      return pivot.x === this.x && pivot.y === this.y;
    };

    Hero.prototype.applyPivots = function() {
      var i, indexToRemove, pivot, _i, _ref;

      indexToRemove = -1;
      for (i = _i = 0, _ref = this.pivots.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
        pivot = this.pivots[i];
        if (this.onPivot(pivot)) {
          this.direction = pivot.direction;
          indexToRemove = i;
        }
      }
      return this.pivots.splice(indexToRemove, 1);
    };

    return Hero;

  })();

错误在说:

  return pivot.x === this.x && pivot.y === this.y;
4

1 回答 1

4

您的for循环限制有问题。假设您的@pivots数组为空,那么for您的循环applyPivots将如下所示:

for i in [0..-1]
  #...

所以它将从零开始并下降到-1。但是@pivots是空的,所以这个:

pivot = @pivots[i]

会给你一个机会undefinedpivot一切都会在一堆混乱中分崩离析。

您可能想要使用循环的for element in array形式:for

applyPivots: () ->
  indexToRemove = -1
  for pivot, i in @pivots
    if(@onPivot(pivot))
      @direction = pivot.direction
      indexToRemove = i
  @pivots.splice(indexToRemove, 1) if(indexToRemove >= 0)

如果什么都没找到(即),大概你不想做任何事情,indexToRemove == -1所以我把它免费扔了。

我想你也可以走得更远一点。像这样的东西:

for pivot, i in @pivots when @onPivot(pivot)
  @direction = pivot.direction
  @pivots.splice(i, 1)
  break

您可以使用when跳过循环中您不关心的内容,并且由于您只想从中删除一件事@pivots,因此您可以在找到它后立即跳出循环。这假设只有 on match in @pivots,如果可能有多个命中并且你真的想要最后一个,那么你可以通过添加向后退by -1

for pivot, i in @pivots by -1 when @onPivot(pivot)
  # same as above...

您可以在精美的手册中找到有关bywhen和其他循环好东西的更多详细信息。


当我在这里时,不要这样做:

class Hero
  pivots: []

这会将您的数组附加到Hero的原型,因此它将由 的所有实例共享Hero。所以如果你这样做:

h1 = new Hero
h2 = new Hero
h1.pivots.push('pancakes')

那么你也会'pancakes'h2.pivots. 您应该在构造函数中为每个实例提供自己的数组:

class Hero
  constructor: (@color, @direction, @x, @y) ->
    @pivots = [ ]

同样的警告适用于您可能想要放入类中的任何可变值。像数字和字符串这样的不可变值很好,你只能给它们分配新值,新值会影响原型的值,所以不会造成任何伤害。

于 2013-06-05T05:35:02.567 回答