У нас есть struct
следующее:
struct ObjectStruct {
bytes32 state;
address owner;
bool isObject;
}
mapping(bytes32 => ObjectStruct) public objectStructs;
bytes32[] public objectList;
Теперь мы хотим изменить bytes32 state;
поле так, чтобы оно было динамическим, и чтобы мы могли «добавить» к нему несколько «под_состояний», например. objectStructs[_object_id].state.location = _location;
или objectStructs[_object_id].state.price= _price;
и т.д.
Как мы можем определить такое «динамическое поле состояния», чтобы мы могли добавить к нему любое «под_состояние»?
Я определил это следующим образом:
struct ObjectStruct {
bytes32 location;
bytes32[] state;
address owner;
bool isObject;
}
А потом :
function newObject(bytes32 _object_id, bytes32 _state, address _owner) public returns(bool success) {
require(!isObject(_object_id));
objectStructs[_object_id].state = _state;
objectStructs[_object_id].owner = _owner;
objectStructs[_object_id].isObject = true;
objectList.push(_object_id);
LogNewObject(msg.sender, _object_id, _state, _owner);
return true;
}
event LogNewObject(address sender, bytes32 _object_id, bytes32 state, address owner);
затем мы вызываем function newObject
следующим образом:
newObject(100, "location:Paris,price:50,sold:yes", '0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773');
Я не прав ?
Не существует такого «динамического поля состояния» , как вы объясняете в своем посте. Но вы можете использовать сопоставление внутри структуры, которое сделает это за вас.
struct StateStruct {
bytes32 description;
mapping(bytes32 => bytes32) sub_state;
}
struct ObjectStruct {
StateStruct state;
address owner;
bool isObject;
}
затем используйте
objectStructs[id].state.sub_state["location"] = "Paris";
objectStructs[id].state.sub_state["sold"] = "Yes";
objectStructs[id].state.sub_state["price"] = 50;
Спрашивающий
мирг
Спрашивающий
мирг
(bytes32[] states,bytes32[] state_values)
перебирающий массив и сохраняющий подсостояниеobjectStructs[_object_id].state.sub_state[states[i]] = state_values[i]
, событие может быть изменено, передавая массивы, а не одну строку (на самом деле это зависит от вас).Спрашивающий
Спрашивающий