有没有办法在fsx文件之间共享类型?
当使用#load加载包含来自多个FSX文件的类型的同一文件时,它们似乎每次都以不同的FS_00xx命名空间为前缀,这意味着您无法传递它们.
有没有办法围绕这种行为而不诉诸编译成程序集?
至于
http://msdn.microsoft.com/en-us/library/dd233169.aspx
[.fsx文件]用于在F#中包含非正式测试代码,而无需将测试代码添加到您的应用程序,也无需为其创建单独的项目.默认情况下,即使项目是项目的一部分,脚本文件也不会包含在项目的构建中.
这意味着如果您的项目具有足够的结构以具有此类依赖性问题,则不应使用.fsx文件,而应使用文件编写模块/命名空间.fs.也就是说,你真的应该将它们编译成一个程序集.
f#交互式解释器为每个加载的文件生成程序集.如果加载文件两次,则会生成两次字节码,即使它们具有相同的定义和相同的名称,类型也会不同.这意味着您无法在两个.fsx文件之间共享类型,除非其中一个包含另一个.
当您#load的文件类型与您环境中已存在的文件类型相同时,f#交互式解释器可以使用两种不同的策略:
FS_00xx命名空间中(以便它们实际上与您已加载的类型不同),最终open生成名称空间,以便可以从交互式会话中获得名称.由于fsx文件应该用作非正式测试,因此使用第二种方法更加用户友好(还有技术原因使用第二种方法,主要依赖于.netVM类型系统,以及现有类型不能使用的事实在运行时更改).
[ 注意:对于更具体的问题,这是一个更具体的答案,与此问题重复.]
我不认为有一个很好的解决方案.我在一些项目中使用的一个解决方案(如F#片段网站)只有一个顶级fsx文件,可以加载大量fs文件.例如,请参阅app.fsx.
所以,你会有common.fs,intMapper.fs并将stringMapper.fs从caller.fsx如下加载:
#load "common.fs"
#load "stringMapper.fs"
#load "intMapper.fs"
open Common
Run Code Online (Sandbox Code Playgroud)
里面stringMapper.fs和intMapper.fs,你就不会加载common.fs.常见的类型将在caller.fsx之前加载,因此事情会起作用.
唯一的问题是intMapper.fs现在不是一个独立的脚本文件 - 如果你想在编辑器中获得自动完成,你需要添加一个fsproj指定文件顺序的文件.在F#snippets项目中,有一个项目文件,它指定编辑器应该看到的顺序并加载文件.