ABAP内联声明变量未显式指定类型时如何确定变量类型?
ABAP内联声明的类型判定逻辑
ABAP里用DATA(变量名)写的内联声明,走的是编译阶段静态类型推导,不是运行时根据实际赋值内容动态猜类型:编译器在代码激活时就会根据声明位置的上下文、赋值源的静态类型把变量类型定死,和运行时传什么值没关系。
两个示例的实际判定结果如下,你的理解有对的部分,也有个常见误区:
示例1的实际类型
代码:
DATA(lv_name) = 'Testing Value'.
这里lv_name不会被推导成STRING字符串类型,这是ABAP新手最容易踩的坑:
- ABAP中单引号包裹的字符字面量,静态类型是定长字符型(也就是C类型),长度等于字面量本身的字符数,
'Testing Value'算上中间的空格一共13个字符,所以lv_name的实际类型是c LENGTH 13,是固定长度的字符变量,不是可变长的STRING。 - 要是想靠内联声明拿到STRING类型的变量,要么右侧用
|Testing Value|这种字符串模板,要么显式做类型转换,比如DATA(lv_name) = CONV string( 'Testing Value' ).。
示例2的实际类型
代码:
SELECT * FROM mara INTO TABLE @DATA(lt_mara) UP TO 10 ROWS.
这里你对lt_mara的类型判断是完全正确的:
- Open SQL里用
@DATA(...)接查询结果时,编译器会根据查询的表、查询字段列表推导内表类型:这段代码写的是SELECT * FROM mara,查询结果的行结构完全匹配MARA数据库表的结构,所以lt_mara会被声明为行类型是MARA的标准内表,和你手动写DATA lt_mara TYPE TABLE OF mara.声明出来的效果完全一致。
补充提醒
内联声明的类型推导完全看赋值源的静态定义,不会“智能”根据内容自动转成更“通用”的类型:比如你给个长度为5的C类型字面量,它就永远是长度5的C,不会自动变成长度更长的C或者STRING类型,这点和JS、Python这类动态语言的变量逻辑完全不一样。
内容的提问来源于stack exchange,提问作者Abapito
相关产品推荐
相关产品推荐

