Ethereum Στερεότητα: Μνήμη εναντίον αποθήκευσης & Πώς να αρχικοποιήσετε έναν πίνακα μέσα σε μια δομή

Στο τηλεγράφημα του δικτύου Loom (το οποίο έχει ~ 8.000 μέλη!), Οι άνθρωποι θέτουν ερωτήματα σχετικά με διάφορα θέματα όπως ο χάρτης πορείας του Loom, τα θεωρητικά blockchain και τα ερωτήματα του Ethereum και η επίλυση προβλημάτων στερεότητας.

Υπήρχε μια συγκεκριμένη ερώτηση που ρωτήθηκε, η οποία περιελάμβανε την προετοιμασία μιας συστοιχίας μέσα σε ένα struct. Το άτομο που το ρώτησε στη συνέχεια παρέσχε τον κώδικα τους, αναρωτιούνται γιατί δεν λειτουργεί. Δεν μπορούσα να σκεφτώ μια απάντηση από την κορυφή του κεφαλιού μου, γι 'αυτό αποφάσισα να μιλήσω για αυτό το θέμα εν συντομία σε μια θέση.

Ο κώδικας που δεν λειτουργεί μπορεί να βρεθεί παρακάτω. Σας ενθαρρύνω να δοκιμάσετε την εξεύρεση λύσης από τον εαυτό σας (έχετε ασκήσει το CryptoZombies όλο αυτό το διάστημα, έτσι δεν έχετε;).

Διαβάστε παρακάτω για να βρείτε την απάντηση.

Θα πρέπει να σημειωθεί ότι στο παραπάνω βιολί, η μνήμη της λέξης κλειδιού είναι απαραίτητη όταν δηλώνεται η μεταβλητή αίθουσα. Εάν δηλώθηκε ως αίθουσα δωματίου, ο μεταγλωττιστής θα επέστρεφε το ακόλουθο σφάλμα:

TypeError: Πληκτρολογήστε struct StructArrayInitWrong.Η μνήμη της μνήμης δεν είναι σιωπηρά μετατρέψιμη στον αναμενόμενο τύπο StructArrayInitWrong.Room δείκτη αποθήκευσης.

Κάποια θεωρία

Οι μεταβλητές αποθήκευσης μιας σύμβασης είναι εκείνες που ορίζουν την κατάσταση της σύμβασής σας και αλλάζουν μόνο με κλήσεις sendTransaction [1].

οι μεταβλητές μνήμης είναι προσωρινές μεταβλητές που υπάρχουν μόνο μέσα στην κλήση (δεν μπορούν να δηλωθούν εκτός ενός). Έχουν σκουπιστεί μετά την έξοδο της λειτουργίας και είναι γενικά φθηνότερα από ό, τι οι μεταβλητές αποθήκευσης - περισσότερες λεπτομέρειες σχετικά με το κόστος του φυσικού αερίου εδώ.

Ας δούμε ένα παράδειγμα για να κατανοήσουμε πώς μια μεταβλητή αποθήκευσης μπορεί να χρησιμοποιηθεί σε μια λειτουργία για να επηρεάσει την κατάσταση μιας σύμβασης.

Στην παρακάτω φιάλη, ένα αντίγραφο του x διαβιβάζεται στο g () καθώς και έτσι η μεταβλητή κατάστασης x θα παραμείνει αμετάβλητη μετά την εκτέλεση (γι 'αυτό και χρησιμοποιούμε την καθαρή λέξη-κλειδί.

Από την άλλη πλευρά, το y στο h () δηλώνεται ως αποθήκευση, πράγμα που σημαίνει ότι το x περνάει με αναφορά. Ως αποτέλεσμα, η μεταβλητή κατάστασης x τροποποιείται μετά την κλήση προς h ().

Μπορείτε να δοκιμάσετε το αποτέλεσμα καλώντας το f () και στη συνέχεια να ελέγξετε την τιμή του y [2]. Παρόλο που το g () καλείται μετά το h (), δεν αλλάζει την τιμή της μεταβλητής κατάστασης.

Αρκετοί θεωρητικοί, ας φτάσουμε στην απάντηση στην αρχική ερώτηση.

Καθώς δεν μπορούμε να αρχικοποιήσουμε τη συστοιχία παικτών κατά την προετοιμασία της δομής, αναγκάζουμε να το κάνουμε αυτό με βήματα:

  1. Αρχικοποιήστε τη δομή του δωματίου στις προκαθορισμένες τιμές με έναν πίνακα κενών παικτών - όπως περιγράφεται εδώ και σε αυτό το βιολί.
  2. Σπρώξτε το δωμάτιο στη συστοιχία των δωματίων.
  3. Push msg.sender στη συστοιχία παικτών τελευταίου δωματίου (rooms.length-1 αναφέρεται πάντοτε στο τελευταίο στοιχείο ενός πίνακα).

Κωδικός Εργασίας παρακάτω:

Το κόλπο εδώ είναι ότι η νέα διεύθυνση [] (0) διαθέτει μνήμη για μια άδεια σειρά διευθύνσεων. Μετά την αρχικοποίηση, το δωμάτιο προστίθεται στα δωμάτια και είναι πλέον μέρος μιας μεταβλητής αποθήκευσης. Αυτό μας επιτρέπει να λειτουργούμε στους παίκτες πίνακα και να πιέζουμε τις τιμές σε αυτό.

Σημείωση: Εάν κάναμε μια νέα uint [] (8) θα πάρουμε μια σειρά από 8 μηδενικά. Μπορείτε να το δοκιμάσετε σε αυτό το βιολί.

Αυτό είναι όλο για σήμερα, ελπίζουμε να ξεκαθαρίσαμε κάποιες παρεξηγήσεις σχετικά με την αποθήκευση / μνήμη και πώς να τις χρησιμοποιήσουμε στις λειτουργίες σας. Ενημερώστε μας για τις ερωτήσεις σας σχετικά με το κανάλι τηλεγραφημάτων μας και εάν δεν μπορούν να απαντηθούν σε μερικά μηνύματα θα αφιερώσουμε μια θέση σε αυτό (ή ίσως ένα μάθημα CryptoZombies!)

Το Loom Network είναι η εξελιγμένη πλατφόρμα επιλογής για τους σοβαρούς προγραμματιστές dapp - το Universal Layer 2 που παρέχει στους προγραμματιστές τα εργαλεία που χρειάζονται για να δημιουργήσουν λειτουργικά dapps που αντιμετωπίζουν οι χρήστες σήμερα.

Νέα στο Loom; Ξεκινήστε εδώ.

Θέλετε να στοιχηματίσετε τα μάρκες σας LOOM και να βοηθήσετε στη διασφάλιση του δικτύου Loom; Βρες πως.

Και αν σας άρεσε αυτό το άρθρο και θέλετε να παραμείνετε στον βρόχο, προχωρήστε και εγγραφείτε για την ιδιωτική λίστα αλληλογραφίας μας.