純粹作爲一個練習在家裏,爲了更好地理解一些語言的基礎知識,我試着重新實現Ord
函數,但是我遇到了一個問題。Ord在Delphi中的函數實現
事實上,現有Ord
函數可以接受的各種不同類型的參數(AnsiChar
,Char
,WideChar
,Enumeration
,Integer
,Int64
)並且可以返回整數或Int64類型。
我無法弄清楚如何聲明同一個函數的多個版本。
這應該怎麼用Delphi編碼?
純粹作爲一個練習在家裏,爲了更好地理解一些語言的基礎知識,我試着重新實現Ord
函數,但是我遇到了一個問題。Ord在Delphi中的函數實現
事實上,現有Ord
函數可以接受的各種不同類型的參數(AnsiChar
,Char
,WideChar
,Enumeration
,Integer
,Int64
)並且可以返回整數或Int64類型。
我無法弄清楚如何聲明同一個函數的多個版本。
這應該怎麼用Delphi編碼?
Ord
無法在Delphi中編碼。雖然可以使用the overload
directive來編寫多個具有相同名稱的函數,但不能以這種方式編寫Ord
函數,因爲它適用於任意數量的參數類型,而不需要多個定義。 (不管你寫多少Ord
過載,我可以隨時拿出你的功能將不會接受一個類型,但編譯器的意志。)
它的工作原理是這樣的,因爲編譯器魔法。編譯器知道Ord
以及程序中的所有序列類型,因此它可以在線執行函數的操作。其他編譯魔術函數包括Length
(魔術,因爲它接受任意數組類型),Str
(魔術,因爲它接受寬度和精度修飾符)和ReadLn
(魔術,因爲它接受任意數量的參數)。
我無法弄清楚如何聲明同一個函數的多個版本。
它被稱爲function overloading。每個版本的輸入參數必須不同,返回類型無關緊要。例如:
function Ord(X: Char): Integer; overload;
begin
// Whatever here
end;
function Ord(X: Integer): Integer; overload;
begin
// Something
end;
// etc.
雖然請注意'ord'是一個特殊的魔術功能,而不是一個正常的帕斯卡功能。爲了推動這一點,請回想一下,在函數過載之前'ord'存在很久才被添加到語言中。 – 2012-03-27 12:51:20
沒錯,如果爲了學習的目的而重新實現,最好把它稱爲「ord」以外的東西! – 2012-03-27 12:54:41
作爲Davids的註釋:Ord的實現實際上並不是什麼,因爲它不會產生額外的操作碼。它是從N.Wirth的原始Pascal描述中聲明的,並且僅告訴編譯器忽略類型不匹配。確實如此:不好的例子... – 2012-03-27 13:04:23
這是標題中引用問題的正確答案。 – boileau 2012-03-27 18:14:16
我並不完全相信在當前的Delphi中'ord'不可能*通過使用無類型參數+一些RTTI混亂。但是,至少這是非常不切實際的! – 2012-03-28 07:53:55
@Joonas,無類型意味着有* no *類型。你不能從沒有類型的東西獲得類型信息。如果你建議使用*泛型*,那麼可能會有一些希望。 – 2012-03-28 14:20:49