F#:静态let和静态成员

问题描述 投票:0回答:3

我是 F# 新手,目前正在阅读 F# 3.0 专家。 这是我学习的第一种编译语言(我只知道用 R 编程)

第6章第117页,我们的介绍没有太多仪式 静态let和静态成员。我不太明白这是什么

type Vector2D(dx : float, dy : float) =
     static let zero = Vector2D(0.0, 0.0)
     static let onex = Vector2D(1.0, 0.0)
     static let oney = Vector2D(0.0, 1.0)
     /// Get the zero vector
     static member Zero = zero
     /// Get a constant vector along the X axis of length one
     static member OneX = onex
     /// Get a constant vector along the Y axis of length one
     static member OneY = oney 

书中没有举例说明谁可以进一步进行。

我正在 F# 交互式中输入此内容。从那里,我如何构造一个值为 0(或 1x...)的变量 x?

我正在尝试以下操作。没有任何效果

let x = Zero;;
let y = Vector2D(2.0,2.0);; /// ok
y.Zero;;
stdin(237,1): error FS0809: Property 'Zero' is static

http://fsharpforfunandprofit.com/posts/classes/ 有这个例子,

type StaticExample() = 
    member this.InstanceValue = 1
    static member StaticValue = 2  // no "this"

// test
let instance = new StaticExample()
printf "%i" instance.InstanceValue
printf "%i" StaticExample.StaticValue

所以我预计

y.Zero;;
会产生以上的结果?...

谢谢。抱歉,这个问题太基本了。如果有人可以向我解释一下它是关于什么的...

static f#
3个回答
8
投票

所以基本的区别是静态成员不属于类的实例。

而不是

y.Zero
,您得到的是
Vector2D.Zero

作为第一个近似值,您可以想到类型属性的这些示例。


1
投票

静态成员属于声明它们的类型,并通过完全限定类型和成员名称进行访问。在这种情况下

let zero = Vector2D.Zero
let oneX = Vector2D.OneX
let oneY = Vector2D.OneY

Vector2D
类型当前没有任何实例成员,但如果有,则可以在
Vector2D

的实例上访问这些成员

0
投票

释义 F# 语言指南的

let
类中的绑定 文章:

类中的

let

 绑定
创建一个 private 字段或函数; 要公开公开数据或函数,请声明属性或成员 方法。

  • 实例 let

     绑定
    是前面没有 let
     关键字的 
    static
     绑定。

    实例

    let

     绑定在创建对象时执行。

  • 静态let

    绑定
    是类的静态初始值设定项的一部分。

    静态

    let

     绑定保证在首次使用类型之前执行。

如果尝试通过删除

Vector2D

static
zero
 私有函数之前的 
onex
 关键字来重构 
oney
 类型,

type Vector2D(dx : float, dy : float) = let zero = Vector2D(0.0, 0.0) let onex = Vector2D(1.0, 0.0) let oney = Vector2D(0.0, 1.0) /// Get the zero vector static member Zero = zero /// Get a constant vector along the X axis of length one static member OneX = onex /// Get a constant vector along the Y axis of length one static member OneY = oney
那么他们就会收到

error FS0039: The value or constructor 'zero' is not defined.
as 

zero

 和公司。仅保证在实例化类时进行评估。

© www.soinside.com 2019 - 2024. All rights reserved.