www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How to "scope"?

reply "Martin" <martinbbjerregaard gmail.com> writes:
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
parent reply "Martin" <martinbbjerregaard gmail.com> writes:
Oops, I of course meant:

static Test createFromString(string str)
{
   return new Test(str);
}
Feb 03 2014
parent reply "Namespace" <rswhite4 googlemail.com> writes:
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: http://dlang.org/phobos/std_typecons.html#.scoped 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
parent reply "Martin" <martinbbjerregaard gmail.com> writes:
On Monday, 3 February 2014 at 17:43:09 UTC, Namespace wrote:
 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: http://dlang.org/phobos/std_typecons.html#.scoped 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.
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.
Feb 03 2014
parent reply "Namespace" <rswhite4 googlemail.com> writes:
On Monday, 3 February 2014 at 17:50:33 UTC, Martin wrote:
 On Monday, 3 February 2014 at 17:43:09 UTC, Namespace wrote:
 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: http://dlang.org/phobos/std_typecons.html#.scoped 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.
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.
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"); } ----
Feb 03 2014
parent "Martin" <martinbbjerregaard gmail.com> writes:
On Monday, 3 February 2014 at 17:58:43 UTC, Namespace wrote:
 On Monday, 3 February 2014 at 17:50:33 UTC, Martin wrote:
 On Monday, 3 February 2014 at 17:43:09 UTC, Namespace wrote:
 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: http://dlang.org/phobos/std_typecons.html#.scoped 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.
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.
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"); } ----
That's exactly what I was looking for. Brilliant, thanks!
Feb 03 2014