4

単純なロガーがあるとしましょう:

void main() {
  var logger = new MyLogger();
  logger.log("hello Dart");
}

このコードを開発モード (VM チェック モード) で実行したいのですが、実稼働コードでは実行したくありません。そして、dart2jsコンパイラで「ツリーを揺さぶる」ことを望んでいます。標準的な方法はありますか?

4

2 に答える 2

4

にコードを埋め込むことができますassertpub buildアサーションは実稼働コードでは無視され、モードで実行されている場合は JS にビルドされていないと確信していreleaseます。

class X {
  X() {
    print('x created');
  }

  void log(String m) {
    print(m);
  }
}

bool log(String m) {
  new X()..log(m);
      return true;
}

void main() {
  assert(() {
    new X()..log('in Assert');
    return true;
  });

  assert(() => log('in Assert')); // use a wrapper function
}

返すラッパーメソッドを作成するときは、true毎回明示的に行う必要はありません。

この質問を見ることもできますプリコンパイラディレクティブのような機能を実現する方法

于 2014-06-13T14:52:36.013 に答える
2

@GünterZöchbauer の「アサート トリック」をファクトリ コンストラクタ内に配置します。

class _ProductionPlug implements DebugClass{
  const _ProductionPlug();
  noSuchMethod(_) {} //do nothing
}

class DebugClass{
  static final DebugClass _plug = const _ProductionPlug();
  log(msg){print(msg);}
  DebugClass._(){}
  factory DebugClass(){
    DebugClass instance;
    assert((){
    instance = new DebugClass._();
    return true;
        });
    return instance != null ?  instance :  _plug;
  }
}
void main() {
  print("hello");
  new DebugClass()
    ..log("debugging");
}

これで何もはみ出さない。

于 2014-06-13T16:28:52.287 に答える