This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center
                            
                        
                    
                
                6年前关闭。
            
        

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


  TypeError:枢轴未定义


这是错误所指的相关类:

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 [[email protected] - 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;

最佳答案

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

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


因此它将从零开始,然后下降到-1。但是@pivots为空,因此:

pivot = @pivots[i]


会在undefined中给您一个pivot,一切都变得一团混乱。

您可能要使用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中删除​​一项,因此一旦找到它,便可以退出循环。假设@pivots中只有匹配项,如果可以有多个匹配项,而您确实想要最后一个匹配项,则可以通过添加by -1来倒退:

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


您可以在the fine manual中找到有关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 = [ ]


同样的注意事项也适用于您可能会试图将其放入类中的任何可变值。不变的值(例如数字和字符串)是可以的,您只能为它们分配新值,而新值将遮盖原型的值,因此不会造成任何危害。

07-26 05:46