Я хотел бы создать экземпляр анонимного класса в F # и определить собственный хэш/равенство. Может кто-нибудь, пожалуйста, скажите мне, как?анонимный класс в F #
Задание Equals/GetHashCode в интерфейсе не работает. Возможно создать методы, но они не могут быть вызваны каким-либо образом, я вижу. В принципе, я хотел бы создать интерфейс IBlah ниже таким образом, чтобы дать мне объект с указанной хэш-функцией. Самое близкое, что я могу получить, это «экземпляр» функции testfixture, но это производит и экземпляр, который использует хэш по умолчанию.
Я также задавался вопросом, может ли кто-нибудь сказать мне, как можно вызвать «внутренний» GetHashCode в классе impl.
Большое спасибо заранее.
open NUnit.Framework
type IBlah =
abstract anint : int
abstract GetHashCode : unit -> int
type impl (i:int) =
interface IBlah with
member x.anint = i
member x.GetHashCode() = failwithf "invoked"
//override x.GetHashCode() = i
[<TestFixture>]
type trivial() =
let instance i =
{
new IBlah with
member x.anint = i
member x.GetHashCode() = failwith "It is invoked after all"
}
// this fails (in the comparison, not due to a failwith)
[<Test>]
member x.hash() =
Assert.AreEqual (instance 1 |> hash, instance 1 |> hash)
// this passes if the commented-out override is added, otherwise it fails due to different hashvalues
[<Test>]
member x.hash'() =
Assert.AreEqual (impl 1 |> hash, impl 1 |> hash)
// this passes whether the override is there or not (i.e. no exception is thrown either way)
[<Test>]
member x.hash''() =
impl 1 :> IBlah |> hash |> ignore