【问题标题】:F# Library structureF# 库结构
【发布时间】:2020-12-22 08:51:00
【问题描述】:

我正在对我的一个项目进行一些重组,并决定为其中很大一部分创建一个单独的库项目。

我的问题在于我有多个带有模块的文件,其中许多应该对用户 API 隐藏,我该如何实现?我以前没有尝试过,所以不熟悉库结构与命令行项目的不同之处,以及如何正确界定事物的范围。如果我可以看到 lib 项目中的每个文件 其他项目为什么我们有 Library.fs 文件?

正式一点。假设我有 SomeCode.fs 和 Library.fs

SomeCode.fs

module SomeCode

type SomeType = ...

let someFunc1 ... = ...

// things to hide here

// depend on hidden code
let SomeFunc2 ... = ... 

库.fs

namespace SomeLib

module Mod1 = ...

这旨在针对其他 F# 项目。如何构建它以便 API 只能看到正确的内容,并且仍然可以维护?

【问题讨论】:

    标签: f# structure lib


    【解决方案1】:

    internal 是你的朋友。如果你声明一个模块

    module internal MyNamSpace.MySecretModule
    

    这只能从您的项目中访问。

    您公开的模块 Library,这是您的 API。

    internal 也可以用于单个功能,以防您只想隐藏某些功能。

    隐藏部分模块的一种相当常见的方法也是采用以下模式

    module MyModule =
    
        [<AutoOpen>]
        module internal MySecretModule =
            let apa = 1
            // Bunch of other internal stuff
    
        // Can use stuff from MySecretModule, but other projects cannot
        let bepa = apa + 1
    

    【讨论】:

    • 但是如果我在模块中有不应隐藏的部件代码部分怎么办?
    • 查看扩展答案
    • 自从我问起它已经改变了。但是感谢这有很大帮助。我正在将我的词法分析器/解析器解释器与我的编译器解耦,并且代码中的很多东西不应该在特定部分之外使用
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多