gpt4 book ai didi

f# - F# 中的成员变量

转载 作者:行者123 更新时间:2023-12-02 04:39:55 24 4
gpt4 key购买 nike

let eval a b = 
let r = a + b
printf "calculate.."
r
type Foo() =
member this.Eval = eval 5 10
[<EntryPoint>]
let main argv =
let f = Foo()
let a = f.Eval
let b = f.Eval
0

这会调用 eval 2 次而不是一次。好像this.Eval是一个函数指针,每次调用.Eval都会调用eval。

我真正想要的是一个变量。

我通过这样做解决了它......

let eval a b = 
let r = a + b
printf "calculate.."
r
type Foo() =
let e = eval 5 10
member this.Eval = e
[<EntryPoint>]
let main argv =
let f = Foo()
let a = f.Eval
let b = f.Eval
0

如果我只想拥有一个成员变量而不是方法,这是正确的做法吗?

最佳答案

您描述的行为是 .NET 属性始终工作的方式,无论是在 C# 还是 F# 中。每次读取属性时都会评估属性的主体。

除了您的正确解决方案之外,我还要补充一点,它会在构造 Foo 时计算值。您可能只希望在第一次读取该属性时计算该值,如果是这样,您可以使用 Lazy这样做:

let eval a b = 
let r = a + b
printf "calculate.."
r
type Foo() =
// a lazy computation that will be evaluated the first time .Value is called
let e = lazy eval 5 10
member this.Eval = e.Value
[<EntryPoint>]
let main argv =
let f = Foo()
let a = f.Eval
let b = f.Eval
0

关于f# - F# 中的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21051769/

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