Flash 有条件地删除对AS3中函数的调用,如C#&x27;s条件赞扬

Flash 有条件地删除对AS3中函数的调用,如C#&x27;s条件赞扬,flash,apache-flex,actionscript-3,Flash,Apache Flex,Actionscript 3,在工作中,我们有很多AS3代码有条件地执行日志记录或断言,如下所示: CONFIG::debug { assert(blah > 2); } 我真的宁愿写: assert(blah > 2); 并让assert()的定义指定,在释放模式下,对它的任何调用,及其参数的表达式都不应该被计算,也就是说,它应该像该行是空的一样。不仅在发布时不应调用assert(),而且不应评估条件blah>2本身 在C#中,这看起来像: [Conditional("DEBUG")] public

在工作中,我们有很多AS3代码有条件地执行日志记录或断言,如下所示:

CONFIG::debug
{
    assert(blah > 2);
}
我真的宁愿写:

assert(blah > 2);
并让
assert()
的定义指定,在释放模式下,对它的任何调用,及其参数的表达式都不应该被计算,也就是说,它应该像该行是空的一样。不仅在发布时不应调用
assert()
,而且不应评估条件
blah>2
本身

在C#中,这看起来像:

[Conditional("DEBUG")]
public static void assert(...) { ... }

或,在C++(粗略):


在AS3中是否有类似的方法,或者我们是否必须围绕所有内容执行条件编译块?我一直在查阅手册,但没有发现任何有用的东西。

我认为,通过这样注释函数的声明,让flex编译器忽略对函数的所有调用是不可能的。事实上,如果你能找到这样做的方法,我会非常感兴趣的-这将有助于清理我的项目的源代码相当多


可以指定方法的两个版本,如中所述。因此,在调试版本中可以有一个完整的
assert(…args)
,在发布版本中可以有一个空的,但在字节码中仍然有函数调用和参数求值(

有一种方法可以做到这一点

如果使用
-ommit trace statements
flex编译器标志(在发布版本中自动启用),则对
trace
函数的所有调用都将被完全剥离,包括对其参数的求值

因此,只需将断言调用包装在跟踪调用中:

trace(assert(blah > 2));

您可以通过在
assert

中执行带有一些副作用的测试来验证此方法是否正确。
-ommit trace statements
建议不再适用于最近的SDK。根据,它现在所做的只是:启用trace()语句,使其不会写入flashlog.txt文件。 我想这是一个拼写错误,意思是防止

您可以使用以下代码对其进行测试,例如:

var err:Error;
trace(err = new Error('trace() arguments are still being evaluated.'));
if (err != null)
    throw err;
我努力实现OP想要的,但到目前为止还没有找到更好的解决方案。AS3不支持宏,条件编译可以去掉断言体,但不能去掉参数求值。 除了使用预处理器(例如asserts剥离器)之外,非常难看的语法似乎是唯一的选择:

CONFIG::debug { assertTrue(fontDescription != null, 'fontDescription != null'); }

+1我会确认这是不可能的。不过功能不错!您应该作为功能请求提交给Adobe的Jira。
CONFIG::debug { assertTrue(fontDescription != null, 'fontDescription != null'); }