【问题标题】:WebSharper: opaque type with equality checking for `===`WebSharper:不透明类型,对 `===` 进行相等检查
【发布时间】:2013-05-27 15:36:25
【问题描述】:

我需要一个在 F# 中完全不透明的数据类型,并根据 JS === 定义相等性。 WebSharper 手册说我应该覆盖Equals,但我不能让它工作。

let x : OpaqueType = X<_>

let f (y : OpaqueType) =
    if x = y then // this line should be translated to `if (x === y)`
        42
    else
        10

那么,OpaqueType 的正确定义是什么?

当然,我可以使用obj 并添加一个内联函数来执行x === y,但我想要更棒的东西。

【问题讨论】:

    标签: f# websharper


    【解决方案1】:

    我会选择这样的:

    module Test =
        open IntelliFactory.WebSharper
    
        [<JavaScript>]
        let Counter = ref 0
    
        [<Sealed>]
        [<JavaScript>]
        type T() =
    
            let hash =
                incr Counter
                Counter.Value
    
            [<JavaScript>]
            override this.GetHashCode() =
                hash
    
            [<JavaScript>]
            override this.Equals(other: obj) =
                other ===. this
    
    
        [<JavaScript>]
        let Main () =
            let a = T()
            let b = T()
            JavaScript.Log(a, b, a = b, a = a, hash a, hash b)
    

    .NET 库期望相等和散列保持一致(例如,用于字典)。它们还通过虚方法与类型相关联,因此内联将无法正常工作。上面的代码为您提供了一个具有类似引用的相等语义的类型。

    【讨论】:

    • 哇,我不知道有(===.) 运算符。我觉得 WebSharper 需要更多的文档……
    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多