![]() |
| 好的 Free 帶你上天堂 (咦?) 圖片來源 |
最近看到一篇關於葡萄牙人寫的文章:FreeAndNil... Esqueça
內文是說明在物件導向的時代,JAVA、C# 這類的語言都有垃圾自動回收機制,進化中的 Delphi 其實也有。
接著便開始說明了使用 FreeAndNil 讓我們的原始碼非常噁心的經過。
提出的解法是使用 Interface!
原先我們的寫法可能是:
![]() |
| 好的 Free 帶你上天堂 (咦?) 圖片來源 |
![]() |
| 泛型 (Generic) 是程式毒藥還是解藥? 圖片來源 |
作者:吳祐賓
原理:步進對字元計數
// D10 after
function OccurrencesOfChar(const S: string; const C: Char): Integer;
var
Ch: Char;
begin
Result := 0;
// 使用 for-in 迴圈遍歷字串,語法更現代且安全
for Ch in S do
begin
if Ch = C then
Inc(Result);
end;
end;
// D7 or Lazarus
function OccurrencesOfChar(const S: string; const C: char): integer;
var
i: Integer;
begin
result := 0;
for i := 1 to Length(S) do
if S[i] = C then
inc(result);
end;
// Example:
//var LNum = OccurrencesOfChar('Banana', 'a');
//Result LNum is 3
function Occurrences(const Substring, Text: string): Integer;
var
Offset: Integer;
begin
Result := 0;
// 防呆處理:如果子字串為空,直接返回 0,避免無窮迴圈
if (Substring = '') or (Text = '') then
Exit;
// 尋找第一個匹配位置
Offset := Pos(Substring, Text);
while Offset <> 0 do
begin
Inc(Result);
// 從「當前位置 + 子字串長度」繼續往後搜尋
// 使用 Pos 的起始偏移量參數 (Offset + Length)
Offset := Pos(Substring, Text, Offset + Length(Substring));
end;
end;
// Example:
//var LNum = Occurrences('an', 'Banana');
//Result LNum is 2