F# 根据输入F的类型比较类型和过程功能#
我有一个房间列表,每个房间都包含一个武器、炸弹或怪物的对象,有没有办法检查包含的是哪种类型,然后根据这一点调用不同的功能?下面是以前的尝试F# 根据输入F的类型比较类型和过程功能#,f#,F#,我有一个房间列表,每个房间都包含一个武器、炸弹或怪物的对象,有没有办法检查包含的是哪种类型,然后根据这一点调用不同的功能?下面是以前的尝试 let ritemprocess (a:Room) = match a.item.GetType with | Bomb -> procBomb(a.item) 这里我看的是一个房间的项目,如果它是一个bomb,我调用processbomb函数,它需要输入类型bomb来工作,但是我得到的错误是a.item是object类型而不是bo
let ritemprocess (a:Room) =
match a.item.GetType with
| Bomb -> procBomb(a.item)
这里我看的是一个房间的项目,如果它是一个bomb,我调用processbomb函数,它需要输入类型bomb来工作,但是我得到的错误是a.item是object类型而不是bomb类型
房间类型如下:
type Room = {
id:int;
item:obj;
n:int;
e:int;
s:int;
w:int;
complete:bool;
}
F#是静态类型的;当您的房间类型显示物品属于obj
类型时,恰恰是因为,您不能在需要非obj
的环境中使用它。有一种方法可以通过运行时类型转换来避免这种情况:
let ritemprocess (a:Room) =
match a.item with
| :? Bomb as bomb -> procBomb bomb
...
但通常,当它作为域模型的一部分发生时,它会被认为是一种代码气味
一种典型的方法是使用一个有区别的联合来模拟您的项目类型:
type Item =
| Weapon of Weapon
| Bomb of Bomb
| Monster of Monster
type Room = {
id:int;
item:Item;
n:int;
e:int;
s:int;
w:int;
complete:bool;
}
假设武器/炸弹/怪物是代码中已经存在的类型。然后您只需匹配项目类型案例:
let ritemprocess (a:Room) =
match a.item with
| Bomb bomb -> procBomb bomb
...