能否连接字符串常量数组?

3

我声明了几个常量数组,我想从这些数组中声明更多的常量,但我无法确定是否有合理的方法来实现它。

const
  Common_Strings : array [0..1] of string = ('foo','bar');
  Extra_Strings : array [0..1] of string = ('some','extra');

我想做的是以下之一:

  Combined_Strings = Common_Strings + Extra_Strings;
  Combined_Strings = (Common_Strings, Extra_Strings);

这看起来似乎应该可以工作,但写起来很丑陋,而且维护起来更加难看,因为我的实际常量有 10+ 个元素:

  Combined_Strings = (Common_Strings[0], Common_Strings[1], Extra_Strings[0], Extra_Strings[1]);

但是,在一时冲动的情况下,常量数组的元素不一定是常量:"[DCC错误] MyFile.pas(89):E2026需要常量表达式"。显然,如果我尝试对它们进行赋值,则会得到"[DCC错误] MyFile.pas(854):E2064左侧无法赋值"。

我注意到也不能编写:

Duplicate_Constant = Common_Strings;

“期望常量表达式”(真的)。有没有一种方法可以将常量数组组合成更多的常量数组?

顺便说一句,您可以将一个常量字符串数组传递给期望“字符串数组”参数的函数。所以某些东西是有效的! - Móż
为什么不直接使用一个变量呢? - Toby Allen
这类似于https://dev59.com/8HHYa4cB1Zd3GeqPLnam#16247955。 - Gerry Coll
有一个丑陋的技巧:包含文件。如果每个包含文件都包含一组字符串常量,您可以声明带有这些常量的类型数组:SILLY1:array [1..3] of string =({$i aa.inc}); (aa.inc 包含一行:“one”,“two”,“three”)。如果您需要操作大量字符串,则可能是合理的。 - Móż
1个回答

4
常量表达式只能声明为常量表达式。您正在尝试声明一个基于类型的常量,而这些类型的常量不是常量表达式,因此您看到的编译器消息是有意设计的。
结论是两个类型常量数组的连接只能在运行时执行。因此,连接的结果只能存储到变量而不是常量中。 数组常量 的文档明确说明了这一点(重点是我的):

要声明一个数组常量,在声明的末尾用括号将数组元素的值用逗号分隔括起来。这些值必须由常量表达式表示


有没有想法为什么类型常量不是常量表达式?我一直觉得这有点奇怪...这是因为“只是因为”还是我错过了一些逻辑? - Marjan Venema
@Marjan 我相信这里面有逻辑,但只有原始设计者才能权威回答。在早期的 TP 版本中,类型常量是可写的。也许这就是驱动设计的原因。我也发现这种限制非常局限。 - David Heffernan
啊,当然是可写常量。又是那些矛盾之一... :) - Marjan Venema

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接