gpt4 book ai didi

f# - 静态成员索引属性

转载 作者:行者123 更新时间:2023-12-01 06:39:00 25 4
gpt4 key购买 nike

是否可以在 F# 中创建静态成员索引属性? MSDN仅针对实例成员显示它们,但是,我可以定义以下类:

type ObjWithStaticProperty =
static member StaticProperty
with get () = 3
and set (value:int) = ()

static member StaticPropertyIndexed1
with get (x:int) = 3
and set (x:int) (value:int) = ()

static member StaticPropertyIndexed2
with get (x:int,y:int) = 3
and set (x:int,y:int) (value:int) = ()

//Type signature given by FSI:
type ObjWithStaticProperty =
class
static member StaticProperty : int
static member StaticPropertyIndexed1 : x:int -> int with get
static member StaticPropertyIndexed2 : x:int * y:int -> int with get
static member StaticProperty : int with set
static member StaticPropertyIndexed1 : x:int -> int with set
static member StaticPropertyIndexed2 : x:int * y:int -> int with set
end

但是当我尝试使用一个时,我得到一个错误:

> ObjWithStaticProperty.StaticPropertyIndexed2.[1,2] <- 3;;

ObjWithStaticProperty.StaticPropertyIndexed2.[1,2] <- 3;;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error FS1187: An indexer property must be given at least one argument

我尝试了几种不同的语法变体,但都没有奏效。同样奇怪的是,当我将鼠标悬停在 VS2010 中的 set 上以获取该类型中的一个定义时,我会获得有关 ExtraTopLevelOperators.set 的信息。

最佳答案

如果您想恢复 Type.Prop.[args] 表示法,那么您可以定义一个简单的对象来表示具有 Item 属性的可索引属性:

type IndexedProperty<'I, 'T>(getter, setter) =
member x.Item
with get (a:'I) : 'T = getter a
and set (a:'I) (v:'T) : unit = setter a v

type ObjWithStaticProperty =
static member StaticPropertyIndexed1 =
IndexedProperty((fun x -> 3), (fun x v -> ()))

ObjWithStaticProperty.StaticPropertyIndexed1.[0]

这每次都会返回一个新的 IndexedProperty 实例,所以最好缓存它。无论如何,我认为这是一个很好的技巧,您可以将一些额外的行为封装到属性类型中。

题外话:我认为对 F# 的优雅扩展应该是具有 一流的属性,就像它具有 一流的事件一样。 (例如,您可以通过一行代码创建自动支持 INotifyPropertyChange 的属性)

关于f# - 静态成员索引属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5400894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com