digitalmars.D.learn - How to "scope"?
Seeing as the scope keyword is (being?) deprecated, how would you handle something like this: class Test { private: string str; this(string str) { this.str = str; } public: static Test createFromString(string str) { return new Test(); } } void main() { // at the end of the scope, test is destroyed and memory is freed scope Test test = Test.createFromString("test"); } The only solution I can think of is using scope(exit) something like this: scope(exit) { destroy(test); GC.free(cast(void*)test); } which seems clumsy. Any other, better solutions?
Feb 03 2014
Oops, I of course meant: static Test createFromString(string str) { return new Test(str); }
Feb 03 2014
On Monday, 3 February 2014 at 17:32:07 UTC, Martin wrote:Oops, I of course meant: static Test createFromString(string str) { return new Test(str); }You _can_ use scoped but it may allocate way to much and it's ugly to use: AFAIK scope'd classes was only deprecated because it _can_ be solved with a library solution and scope is/was not fully implemented. So it was more easy to depecate it and replace it with a library solution, as to implement scope as it stand in the docs.
Feb 03 2014
On Monday, 3 February 2014 at 17:43:09 UTC, Namespace wrote:On Monday, 3 February 2014 at 17:32:07 UTC, Martin wrote:I'm aware of "scoped", that's why I used this specific example. How do you use scoped on a function that returns a new instance of some object? auto obj = scoped(functionThatReturnsNewObject()); That obviously doesn't work.Oops, I of course meant: static Test createFromString(string str) { return new Test(str); }You _can_ use scoped but it may allocate way to much and it's ugly to use: AFAIK scope'd classes was only deprecated because it _can_ be solved with a library solution and scope is/was not fully implemented. So it was more easy to depecate it and replace it with a library solution, as to implement scope as it stand in the docs.
Feb 03 2014
On Monday, 3 February 2014 at 17:50:33 UTC, Martin wrote:On Monday, 3 February 2014 at 17:43:09 UTC, Namespace wrote:In this case where your object already exist and is on the geap, you may want to use Unique: ---- import std.stdio; import std.typecons; class Foo { ~this() { writeln("Foo::DTor"); } } Foo createNewFoo() { return new Foo(); } void main() { { writeln("Startt"); Unique!(Foo) obj = Unique!(Foo)(createNewFoo()); writeln("End"); } writeln("end of main"); } ----On Monday, 3 February 2014 at 17:32:07 UTC, Martin wrote:I'm aware of "scoped", that's why I used this specific example. How do you use scoped on a function that returns a new instance of some object? auto obj = scoped(functionThatReturnsNewObject()); That obviously doesn't work.Oops, I of course meant: static Test createFromString(string str) { return new Test(str); }You _can_ use scoped but it may allocate way to much and it's ugly to use: AFAIK scope'd classes was only deprecated because it _can_ be solved with a library solution and scope is/was not fully implemented. So it was more easy to depecate it and replace it with a library solution, as to implement scope as it stand in the docs.
Feb 03 2014
On Monday, 3 February 2014 at 17:58:43 UTC, Namespace wrote:On Monday, 3 February 2014 at 17:50:33 UTC, Martin wrote:That's exactly what I was looking for. Brilliant, thanks!On Monday, 3 February 2014 at 17:43:09 UTC, Namespace wrote:In this case where your object already exist and is on the geap, you may want to use Unique: ---- import std.stdio; import std.typecons; class Foo { ~this() { writeln("Foo::DTor"); } } Foo createNewFoo() { return new Foo(); } void main() { { writeln("Startt"); Unique!(Foo) obj = Unique!(Foo)(createNewFoo()); writeln("End"); } writeln("end of main"); } ----On Monday, 3 February 2014 at 17:32:07 UTC, Martin wrote:I'm aware of "scoped", that's why I used this specific example. How do you use scoped on a function that returns a new instance of some object? auto obj = scoped(functionThatReturnsNewObject()); That obviously doesn't work.Oops, I of course meant: static Test createFromString(string str) { return new Test(str); }You _can_ use scoped but it may allocate way to much and it's ugly to use: AFAIK scope'd classes was only deprecated because it _can_ be solved with a library solution and scope is/was not fully implemented. So it was more easy to depecate it and replace it with a library solution, as to implement scope as it stand in the docs.
Feb 03 2014