在ABAP中,是否可以动态评估字符串模板?
通常,代码中会有一些字符串模板将由编译器检查。 (编译时编译器会检查花括号中的变量。)
但是,是否可以在运行时评估字符串?
所以,而不是:
data(val) = |System ID: { sy-sysid }|.
我希望插入的字符串来自其他地方,例如:
parameter: p_file type string lower case default '/mnt/{ sy-sysid }/file.txt'.
在这种情况下,我希望在运行时评估p_file
的值,以用变量(sy-sysid
)替换运行时值。
当然,您可以通过使用带有正则表达式的大括号查找所有出现的变量来编程自己的替换,然后使用ASSIGN
计算变量值并将它们替换回字符串,但我正在寻找以内置方式执行此操作。
对不起,这可能是一个愚蠢的例子,但希望你明白我的意思。 (如果没有,请在评论中告诉我,我会尽力澄清)。
答案 0 :(得分:0)
不幸的是,你给出的例子对我没有任何意义。 ABAP字符串模板在运行时进行评估,并在编译时进行类型检查。 在您的示例中,始终将SY-SYSID的运行时值写入变量。
我想你想要做的是绕过字符串模板中表达式的编译时检查。 请尝试向我们提供您的实际用例,以便我们为您的问题找到更好的解决方案。
但是,我认为这可以帮到你:
就个人而言,我不建议编写类似下面的代码,因为它极易出错,可能误导其他程序员,并且因为很可能有更好的解决方案。
鉴于您在运行时知道变量的名称,请尝试以下方法:
this.transactionTemplate = new TransactionTemplate(this.platformTransactionManager);
// note that parameters passed to the transaction must be final!
final Object parameter = something;
Object returnedValue = this.transactionTemplate.execute(new TransactionCallback<Object>()
{
@Override
public Object doInTransaction(TransactionStatus status)
{
return doSomethingAndReturnAnObject(parameter);
}
}
);
答案 1 :(得分:0)
您的代码段中的问题是不是字符串模板,而是PARAMETER行为。它不允许DEFAULT子句动态。
要实现所需的功能,应使用INITIALIZATION
并在运行时设置路径值:
parameter: p_file type string lower case.
INITIALIZATION.
p_file = | /mnt/{ sy-sysid }/file.txt |.