2012-03-27 182 views
6

純粹作爲一個練習在家裏,爲了更好地理解一些語言的基礎知識,我試着重新實現Ord函數,但是我遇到了一個問題。Ord在Delphi中的函數實現

事實上,現有Ord函數可以接受的各種不同類型的參數(AnsiCharCharWideCharEnumerationIntegerInt64)並且可以返回整數或Int64類型。

我無法弄清楚如何聲明同一個函數的多個版本。

這應該怎麼用Delphi編碼?

回答

9

Ord無法在Delphi中編碼。雖然可以使用the overload directive來編寫多個具有相同名稱的函數,但不能以這種方式編寫Ord函數,因爲它適用於任意數量的參數類型,而不需要多個定義。 (不管你寫多少Ord過載,我可以隨時拿出你的功能將不會接受一個類型,但編譯器的意志。)

它的工作原理是這樣的,因爲編譯器魔法。編譯器知道Ord以及程序中的所有序列類型,因此它可以在線執行函數的操作。其他編譯魔術函數包括Length(魔術,因爲它接受任意數組類型),Str(魔術,因爲它接受寬度和精度修飾符)和ReadLn(魔術,因爲它接受任意數量的參數)。

+0

這是標題中引用問題的正確答案。 – boileau 2012-03-27 18:14:16

+0

我並不完全相信在當前的Delphi中'ord'不可能*通過使用無類型參數+一些RTTI混亂。但是,至少這是非常不切實際的! – 2012-03-28 07:53:55

+0

@Joonas,無類型意味着有* no *類型。你不能從沒有類型的東西獲得類型信息。如果你建議使用*泛型*,那麼可能會有一些希望。 – 2012-03-28 14:20:49

12

我無法弄清楚如何聲明同一個函數的多個版本。

它被稱爲function overloading。每個版本的輸入參數必須不同,返回類型無關緊要。例如:

function Ord(X: Char): Integer; overload; 
begin 
    // Whatever here 
end; 

function Ord(X: Integer): Integer; overload; 
begin 
    // Something 
end; 

// etc. 
+4

雖然請注意'ord'是一個特殊的魔術功能,而不是一個正常的帕斯卡功能。爲了推動這一點,請回想一下,在函數過載之前'ord'存在很久才被添加到語言中。 – 2012-03-27 12:51:20

+0

沒錯,如果爲了學習的目的而重新實現,最好把它稱爲「ord」以外的東西! – 2012-03-27 12:54:41

+2

作爲Davids的註釋:Ord的實現實際上並不是什麼,因爲它不會產生額外的操作碼。它是從N.Wirth的原始Pascal描述中聲明的,並且僅告訴編譯器忽略類型不匹配。確實如此:不好的例子... – 2012-03-27 13:04:23