1
我試圖比較兩個關聯數組,每個包含一些結構,以查看它們是否相等,但我得到一個錯誤,但我不知道爲什麼。如果結構具有opEquals
函數,則會發生這種情況。比較傳統(非關聯)數組和相同類型的結構可以很好地工作。下面是一個簡單的程序,說明了這個問題:object.Error比較D中包含結構的關聯數組時
#! /usr/bin/rdmd
import std.stdio;
void main() {
// outputs "true"
writeln([Thing()] == [Thing()]);
// throws an error
writeln(["foo": Thing()] == ["foo": Thing()]);
}
struct Thing {
/* This function needs to be defined to trigger the error but it doesn't
seem to matter what I put in it. */
bool opEquals(ref Thing other) {
return true;
}
}
以下是錯誤消息:
object.Error: TypeInfo.equals is not implemented
----------------
5 structAaTest 0x0000000100003b20 const(pure nothrow @trusted bool function(const(void*), const(void*))) object.TypeInfo_Struct.equals + 64
6 structAaTest 0x0000000100013a70 extern (C) int rt.aaA._aaEqual(TypeInfo, rt.aaA.AA, rt.aaA.AA).int _aaKeys_x(rt.aaA.aaA*) + 152
7 structAaTest 0x00000001000139ad _aaEqual + 261
8 structAaTest 0x0000000100000fbb _Dmain + 319
9 structAaTest 0x00000001000151de extern (C) int rt.dmain2.main(int, char**).void runMain() + 34
10 structAaTest 0x0000000100014b95 extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate()) + 45
11 structAaTest 0x0000000100015228 extern (C) int rt.dmain2.main(int, char**).void runAll() + 56
12 structAaTest 0x0000000100014b95 extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate()) + 45
13 structAaTest 0x0000000100014b1f main + 235
14 structAaTest 0x0000000100000e74 start + 52
15 ??? 0x0000000000000001 0x0 + 1
----------------
我使用DMD v2.060和OS X 10.6.8。
有誰知道爲什麼會發生這種情況,無論是意圖行爲還是錯誤,以及如何處理?
謝謝。我從未想過要這樣做。爲什麼這個工作?爲什麼opEquals在ref或non-const中不起作用?這是記錄在任何地方?爲什麼D編程語言書中的例子是ref?爲什麼我的程序或編譯器不能提供更清晰的錯誤信息? –
另外,無論opEquals簽名如何,爲什麼與非關聯數組的比較即使發生錯誤也能正常工作? –
對不起這些問題,但這對我來說毫無意義,我也沒有看到我不應該問問他人。 –