【发布时间】:2016-02-09 05:17:58
【问题描述】:
我正在尝试重载取消引用 (!) 和赋值 (:=) 运算符,但不是全局的。我仍然想保留通常的 ref op 重载。下面是一些代码来说明问题:
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,它使用引号和 @Carstens 解决方案进行编译,变得有点 more complex。由于 Websharper.UI.Next 包含该解决方案,我只需将其包含在我的项目中,它就可以工作了!
【问题讨论】:
标签: f# overloading operator-keyword