כיצד להחזיר מערך של מבנים בסולידיות – Finxter

Share on facebook
Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp
Share on email
פרסומת
תכנון תשתיות רפואיות


מערך הוא מבנה נתונים שבו ניתן לאחסן מספר ערכים מסוגי נתונים דומים.

לעומת זאת, א struct עובד כמיכל של קבוצת אלמנטים מסוגי נתונים שונים. מבנה יכול להיחשב גם כסוג נתונים חדש.

לפיכך אנו יכולים ליצור מערך של מבנים הכוללים את סוגי הנתונים החדשים הללו.

רוב מוּצָקוּת מתכנתים תוהים בסופו של דבר: איך מחזירים מערך של מבנים מפונקציה?

היום, נעשה זאת ליצור מערך של מבנים ולמצוא דרך החזר את זה מתוך פונקציה.

יצירת מבנה והוספת תכונות

בואו ניצור חוזה בשם SavingsAccount עבור חברי ועדת פינקסטר.

pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;
contract SavingsAccount {
  struct Member{
    uint id;
    string name;
    uint balance;
  }
  mapping (uint => Member) public members;
  event savingsEvent(uint indexed _memberId);
  uint public memberCount;
  • מפרט מקודד ABI הסטנדרטי אינו מתיר מערכים של סוגים דינמיים, מבנים או משתנים מקוננים בין חוזה Solidity לבין dApp. לכן השתמשנו בגרסה ניסיונית ABIEncoderV2, המאפשר שימוש במבנים, משתנים מקוננים ודינאמיים כפרמטרים לפונקציות.
  • יצרנו מבנה לכל חבר בוועדה. זה מורכב מתעודת הזהות של החבר, השם והיתרה.
  • יצרנו מיפוי עם סוג מפתח "uint" וסוג ערך "Member" כדי לאחסן את הערכים. המיפוי עובד כמו א מילון בפייתון או מפה ב-Javascript. שלא כמו Python, אנחנו לא יכולים לחזור על מיפוי או לקבל במהירות את הגודל שלו. אנחנו צריכים לעשות קצת קידוד נוסף עבור איטרציה.
  • אירוע בשם "savingsEventנוסף על מנת לפקח על כל שינויי מצב המתרחשים בתוך החוזה באופן רציף. החוזה החכם יקבל הודעות אוטומטית כאשר חבר חדש יתווסף לוועדה.
  • "indexed" מילת המפתח משמשת כפרמטר בתוך savingsEvent כדי לקבל את האירועים הספציפיים שבהם הפרמטר שווה ל _memberId.
constructor() public {
    memberCount = 0;
    addMember("chris",9000);
    addMember("yassin",6000);
  }
  function addMember(string memory _name, uint _balance) public {
    members[memberCount] = Member(memberCount,_name,_balance);
    memberCount++;
  }
  • נוצר בנאי כדי לספור את מספר האיברים מאפס. שני חברים חדשים כבר נוספו לקונסטרוקטור. אנחנו יכולים ליצור כמה חברים שנרצה מהקונסטרוקטור.
  • ה addMember() הפונקציה לוקחת את השם והאיזון של האיבר החדש כארגומנטים ומוסיפה אותו לבנאי. זה גם מגדיל את מספר החברים כאשר חבר חדש מצטרף לוועדה.

בואו נוסיף חבר חדש כדי לבדוק אם כל הפונקציות פועלות כהלכה. נוסיף חבר חדש בשם "adam"וקבע את המאזן שלו ל-8000.

פרסנו את החוזה והוספנו חבר בשם "adam". ואז לחצנו על "memberCount" כפתור כדי לבדוק כמה חברים היו בוועדה. זה הגיע לתוצאה "3" מאז שהוספנו חבר חדש בוועדה עם "chris" ו"yassin". אז כולם עובדים בסדר.

איך מחזירים מבנה בודד?

ניתן להחזיר מידע של חבר באמצעות הפונקציה הבאה. אנחנו יכולים להשתמש ב _memberID בתור המזהה של החבר ותנו לו להחזיר את המידע של המבנה הזה בתור tuple.

function get(uint _memberId) public view returns(Member memory) {
    return members[_memberId];
  }
  • ה get() הפונקציה לוקחת את _memberId כארגומנט ומחזירה את מידע המבנה של אותו איבר בתור tuple.

כשניסינו להחזיר את המידע של מספר הזיהוי מספר 1, הוא מחזיר את המידע של יאסין מכיוון שספירת החברים מתחילה מ-0. מהטפול, אנו יכולים לראות את זיהוי האיבר הוא 1, שם האיבר הוא יאסין, והיתרה היא 6000.

איך להחזיר את הערך של מבנה?

אם ברצוננו להחזיר מערכים בודדים של ID, שם ויתרה ממידע המבנה אפשרי גם עם פונקציה אחרת. בוא נקפוץ פנימה:

function getMember() public view returns (uint[] memory, string[] memory,uint[]
  memory){
      uint[]    memory id = new uint[](memberCount);
      string[]  memory name = new string[](memberCount);
      uint[]    memory balance = new uint[](memberCount);
      for (uint i = 0; i < memberCount; i++) {
          Member storage member = members[i];
          id[i] = member.id;
          name[i] = member.name;
          balance[i] = member.balance;
      }
      return (id, name,balance);
  }
  • ה getMember() הפונקציה מחזירה כל שדה של האיבר כמערך בודד
  • הכרזנו על שלושה מערכי זיכרון חדשים עם "memberCount", המייצג את האורך של כל מערך זיכרון. בתור ה memberCount גדל עם הוספת איבר חדש, נוכל לראות זאת כאורך המערך.
  • באמצעות לולאת for, אנו חוזרים דרך "members” מערך ואכלס אותו עם המזהה, השם והיתרה של החבר.
  • ה 'return' ביטוי מחזיר מערכים בודדים של המזהה, השם והיתרה של החבר.

כאשר פרסנו את החוזה ולחצנו על "getMember"כפתור, קיבלנו שלושה מערכים של מזהה, שם ויתרה עבור כל חברי ועדת פינקסטר.

כיצד להחזיר מערך של מבנים?

יש לנו את המידע של כל האיברים במספר מערכים מהשיטה שלעיל. אבל מה קורה אם ננסה להחזיר את כל המידע של החברים במערך אחד. האם זה אפשרי בסולידיטי?

זה קצת מסובך, אבל זה אפשרי במובן מסוים. ה getMembers() הפונקציה מאפשרת לנו להשיג זאת.

function getMembers() public view returns (Member[] memory){
      Member[]    memory id = new Member[](memberCount);
      for (uint i = 0; i < memberCount; i++) {
          Member storage member = members[i];
          id[i] = member;
      }
      return id;
  }
}
  • ה getMembers() הפונקציה מחזירה את כל המידע של המבנים במערך
  • מערך זיכרון חדש בשם "id" נוצר עם "new Member[](memberCount)".
  • עבור לולאה חוזרת דרך כל מבנה של "members" מערך ואוסף את המידע במערך אחד.
  • ה "return" מילת מפתח מחזירה מערך הכולל את כל המידע של החבר

כשלחצנו על "getMembers", קיבלנו את כל המידע של החבר במערך. זה מציג את המזהה, השם והאיזון ברצף.

לנוחיותך פרסמתי את הקוד ב GitHub. אתה יכול לקבל את זה כאן:

זה הכל להיום. ישנן שיטות אחרות הזמינות באינטרנט כדי לקבל את התשובה הרצויה. אבל מצאתי את האמור לעיל מתאים. אם אתה מעוניין בעוד כמה פתרונות כמו זה, אתה יכול לבדוק את הקישורים הבאים של StackOverflow.

הפניות:



קישור לכתבת המקור – 2021-12-28 10:29:30

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on telegram
Telegram
Share on whatsapp
WhatsApp
Share on email
Email
פרסומת
X-ray_Promo1

עוד מתחומי האתר