关于 F# 面向对象编程

5
在F#中,我们创建类的方式存在这样的二分法,这让我很困扰。我可以使用隐式格式或显式格式来创建类。但是,我想要的一些功能只能与隐式格式一起使用,有些则只能与显式格式一起使用。
例如:
1. 我无法在显式定义的类内部使用let inline(或仅使用let)。 2. 在隐式定义的类内部,定义不可变的公共字段(而非属性)的唯一方法(据我所知)是使用val bla:bla语法。但这里存在冗余。因为最终会得到两个相同的不可变数据副本,一个私有的,一个公共的(因为在隐式模式下,构造函数参数会在整个类的生命周期内保留)。 3. (不太相关)需要使用属性来进行方法重载和字段默认值设置,这相当烦人。
有没有办法解决这个问题?
*出于性能原因
编辑:事实证明我两点都错了(感谢Ganesh Sittampalam & MichaelGG)。
  1. 虽然我不能在隐式和显式类定义中使用let inline,但我可以完全使用member inline,我认为它会做相同的事情。

  2. 显然,在最新的F#版本中,不再有冗余,因为在类体中未使用的任何参数都是构造函数的局部变量。

  3. 将在下一个F#版本中被删除


出于性能方面的考虑?听起来不太好啊 ;) - Juliet
大部分与图形编程有关的工作都是数字计算。请参考这里:http://blogs.msdn.com/ricom/archive/2006/09/07/745085.aspx。 - Dave Berk
你的问题并没有给出你试图解决的问题的提示。我假设你想在F#中模拟C++风格的面向对象编程。(如果我理解错误,请纠正我!)但是,为什么你需要在一个函数式语言中这样做呢?我认为这可能与你正在处理的问题有关,如果你在这里发表详细的帖子,那会很有趣。 - Vijay Mathew
构造函数参数在Beta1编译器中是否仍然存在?我认为他们已经删除了那些实际上不需要的情况。 - GS - Apologise to Monica
@Ganesh Sittampalam:你是在哪里读到这个的?他们如何确定是否需要它们?谢谢。 - Dave Berk
显示剩余2条评论
2个回答

5

这可能不是很有帮助,但你可以将成员内联。"member inline private" 是可以正常工作的。


确实有帮助。谢谢。这意味着我将采用显式语法。 - Dave Berk

1

对于let inline,您可以通过将其移动到类外部并在调用时从类的作用域内显式传递所需的任何值来解决问题。由于它将被内联,因此执行此操作不会产生性能损失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接