Solidity
創建結構時未初始化映射成員
pragma solidity ^0.4.0; contract TestcaseResetObject { MyObject ob; struct MyObject { mapping(uint8 => uint) map; } event Output(uint number); function makeNew() { ob = MyObject(); ob.map[0] += 1; Output(ob.map[0]); } }
當我在browser-solidity
makeNew
中反復執行時,我希望每次都能得到 event 。相反,我得到, ,等。Output(1)``Output(1)``Output(2)``Output(3)
似乎當我創建一個新
MyObject
的時,地圖實際上並沒有再次創建。另一個問題涉及新初始化的結構在其所有成員中應該具有“零”值。這對於
uint
’s 等似乎是正確的,但由於映射似乎“記住”了它的舊值,所以情況似乎並非如此。有任何想法嗎?
同意吉塞佩的觀點。該程式碼不是“初始化”新的 ob,只是引用現有的。
這是一種讓許多映射不會像那樣碰撞的方法。可能會給你一些想法。
pragma solidity ^0.4.0; contract TestcaseResetObject { uint public objectCount; struct MyObjectStruct { mapping(uint => uint) map; } MyObjectStruct[] myObjects; event LogOutput(uint number); function makeNewObject() public returns(uint count) { MyObjectStruct memory mo; objectCount = myObjects.push(mo); return objectCount; } // object numbers start at 0 when objectCount is 1 function incCounter(uint objectNumber, uint index) public returns(uint newValue) { myObjects[objectNumber].map[index] += 1; LogOutput(myObjects[objectNumber].map[index]); return myObjects[objectNumber].map[index]; } }
讓您用“
makeNewObject
”創建新的映射,用“incCounter
”從數組中挑出一個特定的映射,並在映射內的一個特定位置遞增。希望能幫助到你。