令我难以置信的是,我不明白为什么某些(大多数)字符串例程是给出结果的函数,而某些字符串例程是更改原始字符串的过程。
S2 := Copy(S1,3,2);
从 S1 将第 3 个位置开始的 2 个字符复制到 S2。
Delete(S,3,2);
从 S 中删除从第 3 个位置开始的 2 个字符。
我会认为让 Delete (和其他一些)表现得像大多数其他字符串例程一样更一致,所以你可以写:
S2 := Delete(S1,3,2);
为什么不是这样?
令我难以置信的是,我不明白为什么某些(大多数)字符串例程是给出结果的函数,而某些字符串例程是更改原始字符串的过程。
S2 := Copy(S1,3,2);
从 S1 将第 3 个位置开始的 2 个字符复制到 S2。
Delete(S,3,2);
从 S 中删除从第 3 个位置开始的 2 个字符。
我会认为让 Delete (和其他一些)表现得像大多数其他字符串例程一样更一致,所以你可以写:
S2 := Delete(S1,3,2);
为什么不是这样?
原因就在名字里。
Copy
是一个函数,因为它应该创建一个副本。的过程版本Copy
需要一个额外的参数,因为当已经有源时,目标会去哪里?
Delete
是一个过程,因为它应该从字符串中删除字符。对于Delete
返回删除操作结果的函数版本,源应该变成什么?您正在对其调用删除操作:它不能保持不变。
类比;将其与过程TRect.Offset
和功能进行比较TRect.CenterPoint
。对实体Offset
执行操作,其中读取实体的属性。CenterPoint
首先,copy() 不是一个函数。它是内在的。
其次它的工作是复制,而在 delete() 修改当前字符串的情况下是一个选项,它是删除,而不是复制和删除。
这种差异很重要,因为 Delphi 不受 Java 和 C# 等不可变字符串的影响。
在 ansistring 之前,返回函数总是至少添加一个副本,这在当时的计算机上很明显。ansistring case afaik 仅在内联时更好。