我剛剛遇到了一個問題:當我嘗試從內聯函數訪問私有或內部值時,出現錯誤「The value'xxx'被標記爲內聯,但其實現使用了內部或私有函數沒有足夠的可及性「。雖然邏輯上,我想知道是否有人有一個很好的工作。我能做的最好的事情是公開地將值置於嵌套模塊中,並希望沒有人會徘徊(我不太擔心,因爲這些值是不可改變的)。我想反射是一種選擇,但如果不能緩存呼叫(使用...私人代表),性能影響太大。有沒有什麼好的方法可以讓內聯函數訪問私有或內部值?
3
A
回答
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
相關問題
- 1. 有什麼方法可以內聯遞歸函數嗎?
- 2. 私有方法或內部類
- 3. 私有方法可訪問
- 4. 有沒有什麼方法可以從Coldfusion內部訪問有關Coldfusion服務器負載的信息?
- 5. 訪問私有內部類中重寫的方法與私有構造
- 6. 訪問內部類的私有字段
- 7. 無法從類內部訪問私有方法?
- 8. 有沒有更好的方法讓兩個類互相訪問?
- 9. 爲什麼我可以在C++從外部訪問私有方法?
- 10. 有什麼方法可以有私人數據?
- 11. 訪問JS私有方法
- 12. 有沒有什麼方法可以訪問Android的WebView中的DOM結構?
- 13. 有沒有更好的方法來編寫以下內容?
- 14. C++外部類訪問內部類的私有 - 爲什麼禁止
- 15. 有什麼方法可以根據用戶偏好訪問Google的數據?
- 16. 有沒有一種方法可以改變Javascript中的函數內的原型?
- 17. 有沒有辦法讓Ruby訪問者返回set變量以外的內容?
- 18. 有沒有一種方法可以從內部元素訪問Dom外部的iframe?
- 19. 如何訪問私有方法內的對象?
- 20. 我們可以在方法內部有一個內部類嗎?
- 21. 使用類成員函數訪問類內的私有結構
- 22. 有沒有什麼方法可以在觸發器內部找出是否有打開的包裝事務?
- 23. 有沒有辦法在c#中強制函數內聯?
- 24. 有沒有什麼方法可以使用'unset'作爲方法?
- 25. 有沒有什麼辦法可以訪問一個類的私有成員變量?
- 26. 有沒有一種方法可以從具有內部構造函數的類派生?
- 27. 在內部類中訪問外部類的私有成員:JRuby
- 28. Aspectj和捕捉私有或內部方法
- 29. .java文件中的包私有類 - 爲什麼可以訪問?
- 30. 有沒有辦法將參數轉發到內部constexpr函數?
你有沒有考慮過將這些值作爲參數傳遞給內聯函數? – Jimmy 2011-01-28 09:50:50