#struct #mapping #ethereum #solidity #smartcontracts
#структура #сопоставление #ethereum #solidity #smartcontracts
Вопрос:
После того, как я создал некоторые структуры, которые принадлежат определенным адресам, я хочу получить обзор структур с соответствующими параметрами, относящимися к адресу. Итак, что я мог бы сделать для решения этой проблемы?
Если я запускаю свой код внутри remix, я получаю обратно только свою первую сохраненную структуру для адреса. Но я хочу вернуть все сохраненные структуры для одного адреса. Я знаю, что мы не можем выполнить итерацию по сопоставлению, но, может быть, можно создать некоторый счетчик индексов для массива структур, чтобы решить эту проблему? — Так возможно ли также сохранить индекс массива в переменной?
pragma solidity ^0.4.17;
contract Prescribe {
struct Prescription {
address patients_address;
string medicament;
string dosage_form;
uint amount;
uint date;
//uint index_counter;
}
mapping (address => Prescription[]) public ownerOfPrescription;
address [] public patients;
function createPrescription(address patients_address, string
medicament, string dosage_form, uint amount, uint date) public
restricted {
ownerOfPrescription[patients_address].push(Prescription({
patients_address: patients_address,
medicament: medicament,
dosage_form: dosage_form,
amount: amount,
date: date
}));
patients.push(patients_address);
}
function getOverview(address patient) public view restricted
returns(string, string, uint, uint) {
for(uint i = 0; i < ownerOfPrescription[patient].length; i ) {
if(ownerOfPrescription[patient][i].patients_address == patient) {
return(ownerOfPrescription[patient][i].medicament,
ownerOfPrescription[patient][i].dosage_form,
ownerOfPrescription[patient][i].amount,
ownerOfPrescription[patient][i].date);
}
}
}
Итак, я хочу иметь возвращаемые значения всех отдельных структур одного адреса, как в функции getOverview на экране, но это возвращает мне только первую структуру адреса
Ответ №1:
Ну, это возвращает только первую, потому что после инструкции
if(ownerOfPrescription[patient][i].patients_address == patient)
верните true, ваш код выполняет оператор return, который заставит элемент управления выйти из функции, и больше никаких инструкций выполняться не будет.
Комментарии:
1. Да, это имеет смысл, но как я могу решить эту проблему? — может быть, сохранить значения в другом массиве структур и вернуть их обратно во втором цикле?
Ответ №2:
Хорошо, после исследования я сделал вывод, что по-прежнему невозможно получить массив структур в качестве возвращаемого значения. У вас есть только возможность получить доступ к отдельным элементам массива, верно? — Если есть какие-либо обновления по этой теме, я был бы очень благодарен за подсказку.
Ответ №3:
Есть способ вернуть array of struct, но это будет стоить немного больше платы за газ. Ниже приведен пример
contract Test {
struct FlexiblePlan {
string token;
address _address;
}
struct Plans {
FlexiblePlan[] flexiblePlans;
}
Plans plans;
function createPlan(string memory _token, address _address) external {
plans.flexiblePlans.push(FlexiblePlan(_token, _address));
}
function getAllPlans() external view returns(Plans memory){
return plans;
}
}