码迷,mamicode.com
首页 > 其他好文 > 详细

F#编译器的一个Bug

时间:2014-08-17 11:44:22      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:style   color   使用   div   代码   new   size   ef   

[<Struct>]

typeTestStruct =

    val mutable _x:int

    new(x) = {_x = x}

    member this.Set(x) = this._x <- x

member this.X with get() = this._x;

 

 

let a = TestStruct(2)

let c() =

    a.Set 10

    a.X

 

c();;

这里编译器不报错,但是执行c()的结果是2. 如果把
[<Struct>]去掉,执行结果是10,这就正确了。
结构里,
Set 函数运行没有报错,但是实在上并没有改变到_x的值。

现在我们把后面的代码改动一下,把 a 声明为 mutable:

let mutable a = TestTruct(2)

let c() =

    a.Set 10

    a.X

c();;

最后执行结果是10(正确值)。也就是说,当结构内部含有可变
值(mutable )时候,调用方如果也使用可变值(mutable ),可以得到正确结果。
但是调用方必须清楚结果内部的实现机制才行,这样就违反了结构的封装性。 


因此得出结论:
 

F#中,结构里面的成员变量不能为可变值 
mutable 虽然编译可以通得过,但是可能让调用方得不到预期的结果。








 

F#编译器的一个Bug,布布扣,bubuko.com

F#编译器的一个Bug

标签:style   color   使用   div   代码   new   size   ef   

原文地址:http://www.cnblogs.com/greatim/p/3917540.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!