Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# F中显式成员字段和自动属性之间的差异#_F#_Unity3d - Fatal编程技术网

F# F中显式成员字段和自动属性之间的差异#

F# F中显式成员字段和自动属性之间的差异#,f#,unity3d,F#,Unity3d,在Unity3D中,我们可以通过将字段标记为公共字段,使其在编辑器中可访问。这样就可以在GUI中分配字段变量,而不是对其进行硬编码。例如,此C#代码将显示一个“速度”字段,可在开发过程中手动编辑。如果未修改,则默认为10: public class Example : MonoBehaviour { public float speed = 10.0F; } 我试着用F#做这件事: 但这不起作用。但是,如果我使用 []val可变速度:浮动32 但这样做的缺点是无法在同一表达式中指定

在Unity3D中,我们可以通过将字段标记为公共字段,使其在编辑器中可访问。这样就可以在GUI中分配字段变量,而不是对其进行硬编码。例如,此C#代码将显示一个“速度”字段,可在开发过程中手动编辑。如果未修改,则默认为10:

public class Example : MonoBehaviour {
    public float speed = 10.0F; 
}
我试着用F#做这件事:

但这不起作用。但是,如果我使用

[]val可变速度:浮动32
但这样做的缺点是无法在同一表达式中指定默认值


显式属性和自动属性的编译不是一回事吗?唯一的区别是显式属性总是初始化为零?我如何在F中声明C代码的等价物

我认为您混淆了两个不同的概念:显式字段和自动属性。在后台,属性更像是一个方法而不是一个字段,尽管访问/分配在语法上是相似的。F#相当于你的C#是:

type Example() as this =
  [<DefaultValue>] val mutable public speed: float32;
  do this.speed <- 10.0f
type Example()如下所示=
[]val可变公共速度:浮动32;

做这个。速度我想你在玩一点

,您提供的第一个示例是F#的自动属性。根据记录,您也无法在Unity编辑器窗格中绑定以下C#:

// does not bind in editor either
class Example : MonoBehavior { 
    public float speed { get; set; }
}
您必须将代码与
[DefaultValue]
一起使用,并在构造函数中初始化它,或者使用标记为
[SerializeField]
的let绑定私有字段,并编写自己的属性包装:

type Example () = 
    [<SerializeField>]
    let mutable _speed = 10f
    member this.speed 
        with get () = _speed 
        and set val = _speed <- val
类型示例()=
[]
设可变速度=10f
请记住,速度
使用get()=\u速度

设置val=_speed另一种实现方法,它避免了
[]
和命令式初始化,如下所示(注意第一行没有默认构造函数):


它是如何失败的?如果不使用F#3.0,就不会获得自动属性。否则,您的问题是继承自MonoBehavior并试图重写一个字段,这是禁止的?失败是指Unity编辑器中没有显示任何字段,尽管如果我创建该类的实例,它仍然可以作为公共字段访问。而使用显式属性时,可以通过实例和编辑器访问该字段。两种情况下都没有编译错误。“速度”这个字段没有被覆盖,它是我编的。啊,我把概念搞混了。你的解决方案有效。听起来好像是我重读文档的时候了:-)我有一个问题:我也在用F#构建一个统一游戏。如何在visual studio中调试Unity F#代码?UnityVS有没有办法与F#合作?我已经试过了,但我似乎找不到一个方法来实现这一点…太好了!这更简洁,我可以把我所有的初始化放在一个地方。您甚至可以删除“public”修饰符,因为默认情况下VAL是公共的。
// does not bind in editor either
class Example : MonoBehavior { 
    public float speed { get; set; }
}
type Example () = 
    [<SerializeField>]
    let mutable _speed = 10f
    member this.speed 
        with get () = _speed 
        and set val = _speed <- val
type Example =
    val mutable public speed : float32
    new() = { speed = 10.0f }