2011-01-28 66 views
3

我剛剛遇到了一個問題:當我嘗試從內聯函數訪問私有或內部值時,出現錯誤「The value'xxx'被標記爲內聯,但其實現使用了內部或私有函數沒有足夠的可及性「。雖然邏輯上,我想知道是否有人有一個很好的工作。我能做的最好的事情是公開地將值置於嵌套模塊中,並希望沒有人會徘徊(我不太擔心,因爲這些值是不可改變的)。我想反射是一種選擇,但如果不能緩存呼叫(使用...私人代表),性能影響太大。有沒有什麼好的方法可以讓內聯函數訪問私有或內部值?

+0

你有沒有考慮過將這些值作爲參數傳遞給內聯函數? – Jimmy 2011-01-28 09:50:50

回答

2

簡答:不,因爲該值將內聯插入到呼叫站點,因此無法使用私有值,並且沒有真正的解決方法。

較長的回答:如果您不介意編寫令人難以置信的難看的代碼,並且您可以處理每次使用的一些方法調用的開銷,則另一種方法是創建動態實現(例如,核心庫中的OperatorIntrinsics.AbsDynamicTableImpl),其中可以是私人的。然後,您可以將動態實現封裝在公共不透明的通用方法(例如OperatorIntrinsics.AbsDynamic<'T>)中,然後創建一個內聯值,其中添加適當的類型約束並將其推遲到動態實現(例如let inline abs< ^t when ^t : (static member Abs : ^t -> ^t)> x = AbsDynamic x)。現在,當您聯機abs時,您只會看到AbsDynamic的呼叫,但沒有進一步的實施細節。在大多數情況下,我認爲這將是一個更糟糕的解決方案,而不僅僅是公開而不是公開的價值。

+1

感謝@kvb,我非常肯定,自問題非常深入以來,沒有任何F#技巧可以挽救這一天,但我想知道F#社區如何處理這種情況。在這種情況下,我甚至沒有使用靜態約束,儘管第二段確實幫助我進一步理解了F#核心庫實現技術。默認情況下,至少F#不可變性減輕了暴露實現細節的風險。 – 2011-01-31 02:51:01

相關問題