Я провел некоторое исследование сопоставлений и структур и знаю, что можно хранить структуры в сопоставлении как значение, но не как ключ .
Я пытаюсь создать сопоставление адресов => структур, где несколько адресов указывают на одну и ту же структуру.
Например, у меня есть следующая тестовая структура и сопоставление.
struct test{
uint nonce;
address friend;
}
mapping (address => test) testMapping;
Возможно ли, чтобы два разных адреса сопоставлялись с одной и той же структурой (не только с одними и теми же данными - я не хочу делать копию ради эффективности)?
Если бы мне пришлось писать следующий код, делал бы я копию данных внутри структуры или просто указывал бы два разных ключа на одно и то же место в памяти в рамках сопоставления?
testMapping[address1].nonce = 1;
testMapping[address1].friend = address2;
testMapping[address3] = testMapping[address1];
AKA, выполняйте ли приведенные выше команды копирование значений из testMapping[address1] в testMapping[address2] или просто указывает testMapping[address2] на ту же ячейку памяти, что и testMapping[address1], и в этом случае, когда я обновляю один, оба обновляются?
Спасибо за любую помощь.
Да, вы бы сделали копию.
Вместо этого вы могли бы просто иметь массив, tests
а затем сопоставлять адреса с индексами массива.
struct test{
uint nonce;
address friend;
}
mapping (address => uint) testMapping; //Maps addresses to index in `tests`
test[] tests;
"буду ли я делать копию данных внутри структуры?"
Да.
Это, как правило, становится дороже с размером структуры.
Похоже, вы хотите создать табличное хранилище для людей с ассоциацией «многие ко многим» с другими людьми. Это выполнимо, используя сопоставления для произвольного доступа и массивы для списков ключей. Здесь у человека есть список друзей.
struct PersonStruct {
string data1;
uint data2;
address[] friends;
}
mapping (address => PersonStruct) personStructs;
Это действительно упрощенно; просто чтобы помочь вам подумать о возможностях. Вы сможете перечислить список «друзей» для данного человека с помощью нескольких функций, которые помогут.
Рассмотрим функцию, которая возвращает количество друзей, хранящихся в списке внутри структуры Person:
function personFriendCount(address person) constant returns(uint count) {
return personStructs[person].friends.length;
}
И еще один, чтобы вернуть ключи друзей, когда клиент просматривает список.
function personFriendAtIndex(address person, uint index) constant returns(address friendAddress) {
return personStructs[person].friends[index];
}
Имея в руках ключ друга, клиент может получить структуру для получения подробной информации.
Надеюсь, поможет.
Нейт Раш