digitalmars.D.learn - using "invariant" with structs ... possible to call when a field value
- james.p.leblanc (18/18) Aug 08 2021 Hello,
- FeepingCreature (14/33) Aug 08 2021 You can make a field set function like so:
- james.p.leblanc (11/24) Aug 08 2021 FC,
Hello, With structs, I understand that "invariant checking" is called (from dlang tour): It's called after the constructor has run and before the destructor is called. It's called before entering a member function invariant() is called after exiting a member function. But, is is possible to have the invariant checking be performed whenever a field is directly set? For example, suppose a struct "S", has a field "x". I would like to have invariance check in cases such as: S.x = 4; Maybe there is a hidden set field function that gets called that might be exploitable?? Thoughts on this? Possible? Better paths that I should consider? Best Regards, James
Aug 08 2021
On Sunday, 8 August 2021 at 11:30:41 UTC, james.p.leblanc wrote:Hello, With structs, I understand that "invariant checking" is called (from dlang tour): It's called after the constructor has run and before the destructor is called. It's called before entering a member function invariant() is called after exiting a member function. But, is is possible to have the invariant checking be performed whenever a field is directly set? For example, suppose a struct "S", has a field "x". I would like to have invariance check in cases such as: S.x = 4; Maybe there is a hidden set field function that gets called that might be exploitable?? Thoughts on this? Possible? Better paths that I should consider? Best Regards, JamesYou can make a field set function like so: ``` struct S { private int x_; int x(int value) { return this.x_ = value; } int x() { return this.x_; } } ``` This will then run invariants. (boilerplate can automate that for you. https://code.dlang.org/packages/boilerplate cough self-advertisement cough)
Aug 08 2021
On Sunday, 8 August 2021 at 11:36:51 UTC, FeepingCreature wrote:You can make a field set function like so: ``` struct S { private int x_; int x(int value) { return this.x_ = value; } int x() { return this.x_; } } ``` This will then run invariants. (boilerplate can automate that for you. https://code.dlang.org/packages/boilerplate cough self-advertisement cough)FC, Thanks! This is exactly what I had hoped might be possible! I had made some naive "newbie-D" attempts at something like this be couldn't get anything to work. Thanks for providing an exable of the exact code that would work. Much obliged! Best Regards, James PS Even more important than solving my immediate problem, I have gained a better understanding of the struct and its member functions.
Aug 08 2021