首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过载取消引用(!)和赋值(:=)算子在f#中的作用

过载取消引用(!)和赋值(:=)算子在f#中的作用
EN

Stack Overflow用户
提问于 2016-02-09 05:17:58
回答 1查看 146关注 0票数 2

我正试图使取消引用过载(!)和赋值(:=)运算符,而不是全局的。我仍然希望保持通常的裁判op过载。下面是一些代码来说明这些问题:

代码语言:javascript
复制
type MyVar<'a>(init:'a) =
    let mutable _value = init
    member __.Get() = _value
    member __.Set x = _value <- x
    //static member (!) (s:MyVar<'a>) = s.Get()      // compiles, doesn't work
    //static member (:=) (d:MyVar<'a>, s) = d.Set(s) // warning, doesn't work

//let inline (!) (x :MyVar<'a>) = x.Get()           // overrides !ref
//let inline (:=) (x :MyVar<'a>) (v :'a) = x.Set(v) // overrides ref := v 
let inline (!!) (x :MyVar<'a>) = x.Get()            // works but ugly
let inline (.=) (x :MyVar<'a>) (v :'a) = x.Set(v)   // works ... meh

let test_myvar() =
    let mv = new MyVar<_>("wee")
    let r = ref 100
    let x = !mv
    let y = !!mv
    let z = !r
    mv .= "haaa"
    r := 42

解决方案:

@Carsten的解决方案就是我一直在寻找的&工作方法。然而,事实证明,我使用的是Websharper,它使用Quotations进行编译,@Carstens解决方案变成了一个小更复杂。由于Websharper.UI.Next包含了该解决方案,所以我所要做的就是将其包含在我的项目中,并且它可以工作!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-09 06:01:25

您可以通过在尝试时重载(!)(:=)运算符使其与(!)一起工作:

代码语言:javascript
复制
type MyVar<'a>(init:'a) =
    let mutable _value = init
    member __.Value with get () = _value and set v = _value <- v

let inline (!) a =
    (^a : (member Value : ^b) a)

let inline (:=) a v =
    (^a : (member Value : ^b with set) (a, v))

我删除了您的访问器,因为我只需要与Ref<'a>相同的访问器(但是您可以重新添加它们)

游行示威

下面是一个F#交互会话,用您的值演示这一点:

代码语言:javascript
复制
val mv : MyVar<string>
val r : int ref = {contents = 100;}

> !mv;;
val it : string = "wee"
> !r;;
val it : int = 100
> mv := "It works";;
val it : unit = ()
> !mv;;
val it : string = "It works"
> r := 50;;
val it : unit = ()
> !r;;
val it : int = 50

备注

不过,我不确定我是否真的会这么做--你只是重新发明了Ref-cell (作为一个类),却一无所获,当然,对于其他人来说,这可能很难读懂--所以要小心对待。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35284434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档