11

以下のJavaコードをDartに移植しようとしていますが、これを行うことに戸惑っています。

Java では、Iterable インターフェースは 1 つのメソッドでクリーンな場所であり、これを実装するのは簡単です。

このコードを Dart に変換するにはどうすればよいですか?

/**
 * Chess squares represented as a bitmap.
 */
public class ChessSquares implements Iterable<ChessSquare> {

private static class ChessSquaresIterator implements Iterator<ChessSquare> {
    long bits;
    int nextBit;

    public ChessSquaresIterator(long bits) {
        this.bits = bits;
        nextBit = Long.numberOfTrailingZeros(bits);
    }

    @Override
    public boolean hasNext() {
        return (nextBit < 64);
    }

    @Override
    public ChessSquare next() {
        ChessSquare sq = ChessSquare.values()[nextBit];
        bits = bits & ~sq.bit;
        nextBit = Long.numberOfTrailingZeros(bits);
        return sq;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}


@Override
public Iterator<ChessSquare> iterator() {
    return new ChessSquaresIterator(bits);
}

...
4

2 に答える 2

12

を使用すると、 -functionIterableMixinを実装するだけで済みます。iterator

class ChessSquares with IterableMixin<ChessSquare> {
    @override
    Iterator<ChessSquare> get iterator => new ChessSquaresIterator(bits);
    ...
}

ミックスインの簡単な紹介については、http://blog.sethladd.com/2013/03/first-look-at-dart-mixins.htmlにアクセスしてください。

インターフェースはIterator簡単です。moveNext関数と getterを実装するだけcurrentです。

于 2013-04-20T06:03:20.427 に答える
2

基本クラスを拡張したくないので、これは私が望むものではありません。

/**
 * Chess squares represented as a bitmap.
 */
class ChessSquares extends IterableBase<ChessSquare> {

  Iterator<ChessSquare> get iterator {
    return new ChessSquaresIterator(this);
  }

  ...

}

class ChessSquaresIterator extends Iterator<ChessSquare> {
  int _nextBit;
  int64 _bits;
  ChessSquare _current;

  ChessSquaresIterator(ChessSquares squares) {
    _bits = new int64.fromInt(squares._bits); 
  }

  bool moveNext() {
    _nextBit = _bits.numberOfTrailingZeros();
    if (_nextBit < 64) {
      _current = ChessSquare.values()[_nextBit];
      _bits = _bits & ~_current.bit();
    } else {
      _current = null;
    }
    return _nextBit < 64;
  }

  E get current => _current;
}  
于 2013-04-20T06:11:20.463 に答える