面向过程程序员转F#开发:可变计数器未递增问题求助
问题分析与修复方案
嘿,这个问题我刚学F#的时候也踩过!核心问题出在你对可变变量的赋值方式上——你在upctr成员里误用了let绑定,而不是修改类里的可变ctr变量。
问题根源
在你的代码里,member this.upctr : int = let ctr = ctr + 1 ... 这一行中,let ctr是创建了一个新的局部变量,它和类里定义的mutable ctr是完全不同的两个东西!每次调用upctr,你都是拿类里初始值为0的ctr加1,赋值给这个局部变量,然后返回它,但类里的可变ctr自始至终都没被修改过,所以每次调用结果都是1。
修复后的代码
只需要把局部变量的绑定改成可变变量的赋值(用F#的<-运算符)就行:
type Count() as this = let mutable ctr = 0 do printfn "Count:Constructor: %A" ctr member this.upctr : int = ctr <- ctr + 1 // 这里改成<-赋值,修改类里的可变变量 printfn "inCount.upctr %d" ctr ctr let myCount = new Count() printfn "MyCtr1 %d" (myCount.upctr) let fred = myCount.upctr let fred = myCount.upctr
运行结果验证
修改后运行,你会看到输出依次是:
Count:Constructor: 0 inCount.upctr 1 MyCtr1 1 inCount.upctr 2 inCount.upctr 3
这就符合你想要的计数器递增的预期了。
额外小提示(函数式风格参考)
虽然用可变变量实现计数器没问题,但如果想更贴合F#的函数式风格,你可以考虑用不可变的方式——比如让upctr返回一个新的Count实例(带着更新后的计数),不过这需要调整类的设计。当然,如果你只是需要一个简单的状态记录,当前的修复方案完全够用!
内容的提问来源于stack exchange,提问作者iru
相关产品推荐
相关产品推荐

