1

是否可以在 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并将它们替换回字符串,但我正在寻找一种内置的方法来做这个。

对不起,这可能是一个愚蠢的例子,但希望你明白我的意思。(如果没有,请在评论中告诉我,我会尽力澄清)。

4

2 回答 2

1

您的代码段中的问题在于字符串模板,而在于 PARAMETER 行为。它不允许在 DEFAULT 子句中使用动态。

要实现您想要的,您应该INITIALIZATION在运行时使用并设置路径值:

parameter: p_file type string lower case.

INITIALIZATION.
p_file = | /mnt/{ sy-sysid }/file.txt |.
于 2018-09-04T09:31:17.033 回答
0

不幸的是,你给出的例子对我没有任何意义。ABAP 字符串模板在运行时评估并在编译时进行类型检查。在您的示例中,将始终写入变量的 SY-SYSID 的运行时值。

我猜你想要做的是规避字符串模板中表达式的编译时检查。请尝试向我们提供您的实际用例,以便我们为您的问题找到更好的解决方案。

但是,以下是我认为可以帮助您的方法:

就个人而言,我不建议编写像下面这样的代码,因为它极易出错,可能会误导其他程序员,而且很可能有更好的解决方案。

鉴于您在运行时知道变量的名称,请尝试以下操作:

".. say LV_VARNAME is a charlike variable that contains a
"   variable name at runtime.

"NOTE that the variable LV_VARNAME must be visible in the scope of the
"following code.

FIELD-SYMBOLS: <my_var> TYPE any.

ASSIGN (lv_varname) TO <my_var>.

DATA(lv_str) = |The value is { <my_var> }|.
于 2016-12-20T16:02:58.483 回答