F# 如何更改类中的x,y坐标
我有一个作业,我在课上做了“无人机”和“空域”。 我需要移动存在的所有无人机的x,y坐标,我将其作为列表存储在Airspace类的x.drones中。但是,我在x.drones中访问和操作列表时遇到问题。如何在类中更改来自其他成员的列表的值 到目前为止,我已经给出了我所有的代码,这是我需要帮助的x方法。 我试着做一个for循环,但似乎不起作用F# 如何更改类中的x,y坐标,f#,F#,我有一个作业,我在课上做了“无人机”和“空域”。 我需要移动存在的所有无人机的x,y坐标,我将其作为列表存储在Airspace类的x.drones中。但是,我在x.drones中访问和操作列表时遇到问题。如何在类中更改来自其他成员的列表的值 到目前为止,我已经给出了我所有的代码,这是我需要帮助的x方法。 我试着做一个for循环,但似乎不起作用 module Drones type Drone(x1:int, y1:int, x2:int, y2:int, spd:int) = stat
module Drones
type Drone(x1:int, y1:int, x2:int, y2:int, spd:int) =
static let mutable count = 0
static let mutable hinsta = []
let mutable position = (x1,y1)
let mutable destination = (x2,y2)
let mutable speed = spd
do count <-count + 1
let mutable insta = [x1,y1,x2,y2,spd]
do hinsta <- hinsta @ insta
static member Count = count
static member Collection = hinsta
member x.fly =
if fst destination - fst position > 0 then position <- (x1+1,y1)
else if snd destination - snd position > 0 then position <- (x1,y1+1)
member x.isFinished =
fst destination - fst position = 0 && snd destination - snd position = 0
type Airspace =
member x.drones = Drone.Collection
member x.droneDist(drone1, drone2) =
let dist = ((fst drone1 - fst drone2),(snd drone1 - snd drone2))
dist
member x.flyDrones =
for drone in x.drones do
member x.addDrone(x1, y1, x2, y2, spd) = new Drone(x1, y1, x2, y2, spd)
//member x.willCollide(time) =
模块无人机
类型无人机(x1:int、y1:int、x2:int、y2:int、spd:int)=
静态let可变计数=0
静态let可变hinsta=[]
设可变位置=(x1,y1)
设可变目标=(x2,y2)
让可变速度=spd
很抱歉让你失望了,奥利弗,但这不会成功的。我相信我能看到你的意图,但这需要完全重写,而不是修复。让我试着给你一些建议
首先,为什么要使用类呢?我不会,但我会假设作业上说你应该这样做,所以让我们继续这样做
无人机类应负责保存单个无人机的信息,但空域中的x.Drone设置为“无人机.集合”,它不是无人机的集合或列表,而是无人机类中作为静态列表保存的int*int*int*int
。那真是一团糟。为什么无人机类有静力学?空域类别应负责保存无人机列表,因此请清除无人机中的所有静态信息,并找到一种方法来维护空域类别中的无人机列表
空域类型有实例成员(不是静态成员),但没有构造函数。您可能需要一个默认构造函数,因此它应该是Airspace()=
,然后您需要实例化一个Airspace
当您可以通过获取无人机列表的长度来查找无人机的数量时,您不需要维护计数
您可以解决整个赋值,而无需在任何地方使用单个静态变量
成员名称以大写字母开头
像x.fly和x.flydrone这样的成员不是方法,因为它们没有参数。您至少需要()
参数才能将它们作为方法
x、 addDrone正确地创建了一个新的无人机,但它应该将其添加到Airspace类应有的无人机列表中
Drone类使用元组作为位置和目的地,这导致在整个过程中使用fst
和snd
的代码可读性大大降低。不要那样做。通常,如果元组引起混淆,请使用记录而不是元组。不要使用诸如x1、y1、x2、y2、spd、insta、hinsta、fly等神秘名称
虽然我并没有完全按照自己的建议来做,但一些改动会使无人机类变得更好。使用相同名称的可变项隐藏类参数的要点是1)它们确实是可变的,这意味着它们可以更改;2)阻止进一步使用原始参数,这避免了任何类型的混淆,无论是在编写代码还是在阅读代码时
type Drone(x1:int, y1:int, x2:int, y2:int, speed:int) =
let mutable x1 = x1
let mutable y1 = y1
let mutable x2 = x2
let mutable y2 = y2
let mutable speed = speed
member _.X1 = x1
member _.Y1 = y1
member _.X2 = x2
member _.Y2 = y2
member _.Speed = speed
member _.Fly() =
if x2 - x1 > 0 then x1 <- x1 + 1
elif y2 - y1 > 0 then y1 <- y1 + 1
member _.IsFinished = x2 - x1 = 0 && y2 - y1 = 0
型无人机(x1:int,y1:int,x2:int,y2:int,速度:int)=
设可变x1=x1
设可变y1=y1
设可变x2=x2
设可变y2=y2
让可变速度=速度
成员X1=X1
成员u0.Y1=Y1
成员ux2=X2
成员u0.Y2=Y2
成员速度=速度
成员u.Fly()=
如果x2-x1>0,那么x10,那么y1很抱歉让你失望,奥利弗,但这不会飞。我相信我能看到你的意图,但这需要完全重写,而不是修复。让我试着给你一些建议
首先,为什么要使用类呢?我不会,但我会假设作业上说你应该这样做,所以让我们继续这样做
无人机类应负责保存单个无人机的信息,但空域中的x.Drone设置为“无人机.集合”,它不是无人机的集合或列表,而是无人机类中作为静态列表保存的int*int*int*int
。那真是一团糟。为什么无人机类有静力学?空域类别应负责保存无人机列表,因此请清除无人机中的所有静态信息,并找到一种方法来维护空域类别中的无人机列表
空域类型有实例成员(不是静态成员),但没有构造函数。您可能需要一个默认构造函数,因此它应该是Airspace()=
,然后您需要实例化一个Airspace
当您可以通过获取无人机列表的长度来查找无人机的数量时,您不需要维护计数
您可以解决整个赋值,而无需在任何地方使用单个静态变量
成员名称以大写字母开头
像x.fly和x.flydrone这样的成员不是方法,因为它们没有参数。您至少需要()
参数才能将它们作为方法
x、 addDrone正确地创建了一个新的无人机,但它应该将其添加到Airspace类应有的无人机列表中
Drone类使用元组作为位置和目的地,这导致在整个过程中使用fst
和snd
的代码可读性大大降低。不要那样做。通常,如果元组引起混淆,请使用记录而不是元组。不要使用诸如x1、y1、x2、y2、spd、insta、hinsta、fly等神秘名称
虽然我并没有完全按照自己的建议来做,但一些改动会使无人机类变得更好。使用相同名称的可变项来隐藏类参数的要点是1)它们确实是可变的,这意味着它们可以更改;2)阻止进一步使用原始参数,这避免了任何类型的混淆,无论是