令我难以置信的是,我不明白为什么一些(大多数)字符串例程是提供结果的函数,而一些字符串例程是更改原始字符串的过程。
S2 := Copy(S1,3,2);
从S1复制到S2中从第3个位置开始的2个字符。
Delete(S,3,2);
从S中删除从第3个位置开始的2个字符。
我认为让Delete(和其他几个)的行为与大多数其他字符串例程一样更加一致,所以你可以这样写:
S2 := Delete(S1,3,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更好。