Structs allow you to combine multiple primitives together in a more semantic way. They're a great tool to make your code more readable.
Structs can define complex data types that contain multiple fields of different types. They can also be nested.
Structs can also include both default fields and optional fields. This can be quite useful when you have many fields but don't want to keep respecifying them.
Structs are also useful as return values from getters or other internal functions. They effectively allow a single getter to return multiple return values.
The order of fields does not matter. Unlike other languages, Tact does not have any padding between fields.
Structs and messages are almost identical with the only difference that messages have a 32-bit header containing their unique numeric id. This allows messages to be used with receivers since the contract can tell different types of messages apart based on this id.
All Examplesimport "@stdlib/deploy"; contract Receivers with Deployable { val: Int as int64; init() { self.val = 0; } // this receiver is called when the string "increment" is received in an incoming string comment message receive("increment") { self.val = self.val + 1; } // this receiver is called when the string "decrement" is received in an incoming string comment message receive("decrement") { self.val = self.val - 1; } // this receiver is called when the string "increment by 2" is received in an incoming string comment message receive("increment by 2") { self.val = self.val + 2; } // if none of the previous receivers match the comment string, this one is called receive(msg: String) { dump("unknown textual message received:"); dump(msg); } get fun value(): Int { return self.val; } }