単純なロガーがあるとしましょう:
void main() {
var logger = new MyLogger();
logger.log("hello Dart");
}
このコードを開発モード (VM チェック モード) で実行したいのですが、実稼働コードでは実行したくありません。そして、dart2jsコンパイラで「ツリーを揺さぶる」ことを望んでいます。標準的な方法はありますか?
にコードを埋め込むことができますassert
。pub 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
毎回明示的に行う必要はありません。
この質問を見ることもできますプリコンパイラディレクティブのような機能を実現する方法
@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");
}
これで何もはみ出さない。