F# 入门(八):值类型/引用类型
总得来说,数据值存储在栈上面的称为值类型,而数据值存储在堆上面的称为引用类型。
对于F#而言,每个声明的值都会在创建时被初始化,因为在函数式的编程中,值被声明后就是不可变的。下面看看怎么获取某个值的情况:
Unchecked.defaultof<'a>
获取'a的默认值
typeof<'a>
返回描述'a的System.Type对象
sizeof<'a>
返回'a在栈上的空间大小
在F#中,默认所有值是不能更改的,那么怎么样来改变一个值呢,一个方法是用Ref引用单元(主要用于引用类型的更改),还有用mutable关键字(主要用于值类型的更改),下篇会讲关于mutable。
这里使用ref将值变为引用类型,同时,使用!读取引用类型的值,使用:=写入引用类型的值。让我们来看看例子:
1)
//将引用类型的值绑定给变量a
> let a = ref "hello";;
val a : string ref = {contents = "hello";}
//读取a的值
> !a;;
val it : string = "hello"
//写入a的值然后显示
> a := "world";;
val it : unit = ()
> !a;;
val it : string = "world"
2)
//对于引用类型改变值
> let Days =
ref [ "Monday"; "Tuesday";
"Wednesday"; "Thursday";
"Friday"; "Saturday";
"Sunday";]
//过滤掉星期天
// 通过(!)获取Days的,再通过(:=)赋予新的值
Days := !Days |> List.filter(fun d -> d <> "Sunday");;
val Days : string list ref =
{contents =
["Monday"; "Tuesday"; "Wednesday"; "Thursday"; "Friday"; "Saturday"];}