Thread overview
How to "scope"?
Feb 03, 2014
Martin
Feb 03, 2014
Martin
Feb 03, 2014
Namespace
Feb 03, 2014
Martin
Feb 03, 2014
Namespace
Feb 03, 2014
Martin
February 03, 2014
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?

February 03, 2014
Oops, I of course meant:

static Test createFromString(string str)
{
  return new Test(str);
}
February 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:
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.
February 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:
>> 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.
February 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:
>> 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");
}
----
February 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:
>> 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!