F# 重载f中的取消引用(!)和赋值(:=)运算符#
我试图重载取消引用(!)和赋值(:=)运算符,但不是全局重载。我仍然想保留通常的ref-op重载。下面是一些代码来说明这些问题:F# 重载f中的取消引用(!)和赋值(:=)运算符#,f#,overloading,operator-keyword,F#,Overloading,Operator Keyword,我试图重载取消引用(!)和赋值(:=)运算符,但不是全局重载。我仍然想保留通常的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()
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
typemyvar)=x.Get()//可以工作,但很难看
让内联(.=)(x:MyVar您可以使用它-通过在尝试时重载(!)
和(:=)
运算符:
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))
键入MyVar如果MyRef有其他功能,这很有用。例如,我们在UI中使用它。下一步为。这就是我要寻找的。但是有一些复杂的情况。请参阅OP。我现在得到了您的评论。我可以使用mv.Value中的值
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