目前笔者大部分时间,都投入了日常开发工作的 Angular 技术研究中。
剩下的业余时间,主要花费在笔者下面五套 SAP 开发技术教程的持续更新上:
SAP ABAP 开发教程
SAP UI5 开发教程
SAP OData 开发教程
SAP Fiori Elements 开发教程
SAP CDS View 开发教程
本专栏之前的文章:
1.到底哪些单词不能作为 ABAP 透明表名称使用?
在 SAP UI5 和 SAP 电商云等前端开发中,特殊符号 " ! " 随处可见。
在 JavaScript 和 TypeScript 里," ! " 是逻辑非运算符,它会先执行当前被操作的变量,到 Boolean 的类型转换,再对结果取反。
所谓对结果取反,意思是给定一个真值,!value 返回 false;给定一个假值,!value 返回 true.
因此," ! " 不仅实现逻辑否定,还顺带完成了类型转换。
连续应用两次逻辑非运算(!!),即 !!value,会抵消第一次的否定,将操作数在布尔类型层面恢复原状,但此时已完成到 Boolean 类型的转换,确保返回值为纯布尔类型。
相比之下,ABAP 里的 " ! " 使用场合远远没有 JavaScript 和 TypeScript 那样广泛。
在 ABAP 里的逻辑非运算操作并不是由 " ! " 来完成,采用的是 NOT.
笔者之前的文章:一段让人瑟瑟发抖的 ABAP 代码,分享的就是一段通过精心编排,大量使用 NOT 关键字,而让 ABAP 开发人员读了瑟瑟发抖的怪兽级 ABAP 代码:
源代码如下:
REPORT 汪子熙的Report,吓死人了!!!!!.INCLUDE NOT.IF NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOTNOT NOT NOT NOT NOT NOT NOT NOT NOT NOT !NOT OR NOTNOT NOT !NOT OR NOT NOT NOT NOT NOT=>NOT( NOT ) ANDNOT NOT NOT !NOT OR NOT NOT !NOT AND NOT !NOT ... NOT.
对这段源代码的解读和本文主题关系不大,大家可以在下面这篇文章里找到答案。
昨日万圣节 ABAP 怪兽级代码谜团,公布答案啦
再回到 ABAP 的 " ! ".
看个例子。我们想定义一个简单的 subroutine,包含一个 USING 和一个 CHANGING 类型的参数。
USING 类型的参数名称,我就想用 CHANGING;
CHANGING 类型的参数名称,我就想用 USING;
REPORT z.START-OF-SELECTION.FORM test USING changing CHANGING using.using = changing.ENDFORM.
显然这段代码不能通过编译。在现实项目中谁要想用这种反人类的变量命名方式,估计会被项目组其他成员掐死。
从 ABAP 编译器报错消息来看:
USING must be followed by at least one parameter
显然,ABAP 编译器并没有把紧跟在 USING 后的第一个 changing,当成参数名称来看待,而将其当做 CHANGING 关键字来处理。
那么我们就在第一个 changing 前面,手动加上一个" ! ",告诉 ABAP 编译器," ! " 符号后面的是一个「变量名称」,而不是「关键字」。
加上 " ! " 之后代码能够顺利编译并正常运行。
因此,ABAP 里的 " ! ",是一个「转义标识符」,当它放在一个标识符前时,用来告诉 ABAP 编译器:该名称不是 ABAP 关键字,而是一个用户定义的标识符。
当变量名、参数名等标识符,恰好与某个 ABAP 关键字相同时,需要在标识符前加 " ! " 来转义。
在程序运行时," ! " 不会对程序的实际逻辑产生影响。
如果我们查看使用 SE24 或者 SE80 生成的 ABAP 类的源代码,会发现类的方法参数名称前,也都默认加上了 " ! " 来进行转义,避免这些参数名称可能会与 ABAP 关键字冲突。这也算是严谨的 ABAP 系统采取的一种防御式编程策略吧。
今天的五分钟分享就到这里,明天见。
领取专属 10元无门槛券
私享最新 技术干货