【问题标题】:Signature Files and Access Modifers in F#F# 中的签名文件和访问修饰符
【发布时间】:2010-12-04 08:33:28
【问题描述】:

我最近一直在尝试学习 F# 的面向对象方面,并且对如何限制对语言中类型/模块的访问感到好奇。

更具体地说,我想知道写这个的区别:

Example.fsi

module Stack =
    val foo : string

Example.fs

module Stack =
    let foo = "foo"
    let bar = "bar"

或者这个:

module Stack =
    let foo = "foo"
    let private bar = "bar"

他们最终不会完成完全相同的事情吗?来自 C# 背景,我更倾向于使用访问修饰符而不是签名 (FSI) 文件。它们似乎更通用(例如,可以应用于命名空间中的模块/类型),而我在任何情况下都没有签名文件提供访问修饰符不提供的东西。

【问题讨论】:

  • 你的例子无论如何都不应该工作 ;-) (let foo _ = "bar")
  • 为什么它不能工作?该示例对我来说编译得很好。
  • .fsi 将 foo 声明为一个函数,但随后 .fs 将其定义为一个值。

标签: f# access-modifiers signature-files


【解决方案1】:

他们完成几乎相同的事情。 (请注意,您也可以将 .fsi 文件用于命名空间中的类型,不确定您对此的评论是什么意思。)

签名文件有几个优点:

  • 您可以在文件期间创建实体public,然后在项目的后续文件中创建private
  • 您可以在签名文件中仅包含简短摘要,因此公共界面易于阅读,无需扫描大量代码。

第一个要点不容小觑 - 像这样的程序集内封装对于非常大的项目来说实际上是一个相当大的功能。能够在 File1.fs 中定义一些相互公开的类型,但只有这些类型/方法的子集对其余类型(File2.fs、File3.fs 等)是公开的,这是非常有用的(有点像 C++ 中的“朋友”)。

【讨论】:

  • @Brian:感谢您的回答。我指的是此页面的底部 - en.wikibooks.org/wiki/F_Sharp_Programming/… - 无法在命名空间上使用 FSI。您能否澄清一下您所说的项目“续集”是什么意思?
  • 我明白了,那个文件是错误的; @Juliet,如果您正在阅读此内容,您会更新它吗?请注意,您可以在包含命名空间的 .fs 文件上使用 fsc --sig 来查看命名空间的 .fsi 代码的语法。
  • @Brian: 啊,那么公平。有用的小命令,就是这样。也感谢您的澄清。
  • “您可以在文件期间将实体设为公开,然后对项目的后续文件设为私有。”:对于这种封装,您实际上不需要签名文件。一个更简单的方法是使用“命名空间声明组封装”,即定义一个新的子命名空间并将相应的类型声明为私有。
  • "您可以在签名文件中仅包含简短摘要,因此公共界面易于阅读,无需扫描大量代码。"没错,但分析/调试代码更加困难,因为在 Visual Studio 中,“转到定义”会跳转到签名文件而不是实现文件,然后您必须手动搜索 用于实现......这在复杂项目中可能是一个真正的痛苦。
猜你喜欢
  • 2018-03-06
  • 1970-01-01
  • 2017-03-13
  • 2010-11-22
  • 2012-03-25
  • 2020-07-17
  • 2014-11-03
  • 2016-01-29
  • 2013-12-01
相关资源
最近更新 更多