2013-01-01 60 views
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。

有誰知道爲什麼會發生這種情況,無論是意圖行爲還是錯誤,以及如何處理?

回答

4

嘗試將您的opEquals更改爲const和non-ref。

bool opEquals(Thing other) const { 
    return true; 
} 

我認爲dmd最近更改爲opEquals簽名更嚴格。

+0

謝謝。我從未想過要這樣做。爲什麼這個工作?爲什麼opEquals在ref或non-const中不起作用?這是記錄在任何地方?爲什麼D編程語言書中的例子是ref?爲什麼我的程序或編譯器不能提供更清晰的錯誤信息? –

+0

另外,無論opEquals簽名如何,爲什麼與非關聯數組的比較即使發生錯誤也能正常工作? –

+0

對不起這些問題,但這對我來說毫無意義,我也沒有看到我不應該問問他人。 –