Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 内联函数访问私有值或内部值有什么好方法吗?_F#_Inline Functions - Fatal编程技术网

F# 内联函数访问私有值或内部值有什么好方法吗?

F# 内联函数访问私有值或内部值有什么好方法吗?,f#,inline-functions,F#,Inline Functions,我刚刚遇到了一个问题:当我试图从内联函数访问私有或内部值时,我得到了一个错误“值'xxx'被标记为内联,但它的实现使用了一个内部或私有函数,该函数不能充分访问”。虽然合乎逻辑,但我想知道是否有人有一个很好的解决办法。我认为最好的办法是将这些值公开放置在嵌套模块中,并希望没有人去到处窥探(这一点我并不太担心,因为这些值是不可变的)。我认为反射是一种选择,但是如果不能缓存调用(使用…私有委托),性能影响太大了。简短回答:不,因为该值将内联插入调用站点,所以它不能使用私有值,也没有真正的解决方法 更详

我刚刚遇到了一个问题:当我试图从内联函数访问私有或内部值时,我得到了一个错误“值'xxx'被标记为内联,但它的实现使用了一个内部或私有函数,该函数不能充分访问”。虽然合乎逻辑,但我想知道是否有人有一个很好的解决办法。我认为最好的办法是将这些值公开放置在嵌套模块中,并希望没有人去到处窥探(这一点我并不太担心,因为这些值是不可变的)。我认为反射是一种选择,但是如果不能缓存调用(使用…私有委托),性能影响太大了。

简短回答:不,因为该值将内联插入调用站点,所以它不能使用私有值,也没有真正的解决方法


更详细的回答:如果您不介意编写极其难看的代码,并且可以处理每次使用几个方法调用的开销,那么一种替代方法是创建一个动态实现(例如核心库中的
OperatorIntrinsics.AbsDynamicTableImpl
),它可以是私有的。然后,可以将动态实现包装到公共不透明泛型方法中(例如,
operatorintrisics.AbsDynamichave您是否考虑过将这些值作为参数传递到内联函数中?感谢@kvb,我非常确定不会有F#技巧来挽救这一天,因为问题非常严重,但我想了解F#社区是如何处理这种情况的。在这种情况下,我甚至不需要静态约束,t尽管你的第二段确实帮助我进一步理解了F#core库的实现技术,但至少默认情况下F#不变性降低了暴露实现细节的风险。