gpt4 book ai didi

f# - 对 F# 中的字段及其访问规则以及初始化非常困惑

转载 作者:行者123 更新时间:2023-12-03 17:27:56 24 4
gpt4 key购买 nike

让我们上这门课:

type Test() =

let mutable Flag1 : bool = false
[<DefaultValue>] val mutable Flag2 : bool

do
Flag1 <- true // that works
Flag2 <- true // nope... why?

member this.SetFlag =
Flag1 <- true // no 'this' instance? does that mean it's static?
this.Flag2 <- true // that works now, but still no way to set a default value

为什么需要 [<DefaultValue>]当我希望能够将值设置为自己的任何值时?

然后现在:
type Test2() =
Inherit(Test)

do
Flag1 <- true // not accessible
Flag2 <- true // not happening either

member this.SetFlag2 =
Flag1 <- true // not accessible
this.Flag2 <- true // ok

所以我可以这样做:
    member val Flag1 : bool with get, set

但是为什么不是语法 val this.Flag1 因为它是实例的一部分?
并且..我无法从构造函数中访问它。

谁能解释这是如何工作的?因为它非常困惑。
如果您不能在其中设置东西,那么构造函数的用处似乎很低。或者,我错过了什么?
而且我无法构造类的实例并通过 new() 构造函数设置变量,因为最后一条语句需要返回实例,所以我无法创建实例,设置我需要的所有内容然后返回它。或者,有可能吗?

另外,我怎样才能有一个字段:
  • 是实例字段,不是静态的
  • 我可以在构造函数
  • 中初始化任何我想要的东西
  • 是可变的
  • 可从成员函数
  • 访问

    本质上就像 C# 中的普通字段。

    我想要实现的是:
    我需要有一个属于类实例并且可以在构造函数中初始化的计时器对象。类方法需要访问定时器,定时器的回调需要访问类字段。

    在伪 C# 中,我会有这样的东西:
    Class A
    {
    public Timer MyTimer;
    public bool Flag1, Flag2;

    A()
    {
    MyTimer = new Timer(Callback);
    }

    public void StartTimer()
    {
    MyTimer.Start();
    }

    public void Callback()
    {
    if (Flag1) Flag2 = true;
    }
    }

    public class B : A
    {
    public void DoStuff()
    {
    Flag1 = True;
    }
    }

    最佳答案

    您需要为它的所有主体指定一个类型实例别名:

    type Test() (*here is the part you need: *) as this = 
    // ...
    // and then you can access your public mutable field by type instance alias:
    do this.Flag2 <- true

    此外,在您的第二个继承类( Test2 )中,您可以访问 标志2 具有相同语法的字段。顺便说一下 字段1 无法在 中访问测试2 类,因为它是私有(private)的,因为您使用 let 定义了它捆绑

    关于f# - 对 F# 中的字段及其访问规则以及初始化非常困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58811706/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com