为什么有些字符串例程会给出结果并且有些更改Delphi中的原始文件?

时间:2013-09-20 14:04:39

标签: delphi language-design pascal library-design

令我难以置信的是,我不明白为什么一些(大多数)字符串例程是提供结果的函数,而一些字符串例程是更改原始字符串的过程。

S2 := Copy(S1,3,2);

从S1复制到S2中从第3个位置开始的2个字符。

Delete(S,3,2);

从S中删除从第3个位置开始的2个字符。

我认为让Delete(和其他几个)的行为与大多数其他字符串例程一样更加一致,所以你可以这样写:

S2 := Delete(S1,3,2);

为什么不是这种情况?

2 个答案:

答案 0 :(得分:4)

原因在于名称。

Copy是一个函数,因为它应该创建一个副本。 Copy的过程版本需要一个额外的参数,因为当已有源时,目标会在哪里?

Delete是一个过程,因为它应该从字符串中删除字符。对于返回删除操作结果的函数版本Delete,源应该成为什么?你正在调用它上面的删除操作:它不能保持不变。

类比;将其与过程TRect.Offset和函数TRect.CenterPoint进行比较。 Offset 在实体上执行 操作,其中CenterPoint 读取 属性实体。

答案 1 :(得分:1)

首先,copy()不是函数。这是一种内在的。

其次是作业是复制,而在delete()的情况下修改当前字符串是一个选项,它是删除,而不是copyanddelete。

这种差异很重要,因为Delphi不会受到Java和C#等不可变字符串的影响。

在ansistring之前,返回函数总是至少添加一个副本,这在当天的计算机上是显而易见的。在内联时,ansistring case afaik更好。